1. 程式人生 > >淺談json web token及應用

淺談json web token及應用

Json Web Token (JWT),是一個非常輕巧的規範,這個規範允許在網路應用環境間客戶端和伺服器間較安全的傳遞資訊。該token被設計為緊湊且安全的,特別適用於分散式站點的單點登入(SSO)場景。JWT一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源。

在web應用中,我們提供的API介面,通過GET或者POST方式呼叫,在呼叫過程中,就存在著介面認證及資料的安全性問題。例如如下問題:

1、請求來自哪裡,身份是否合法?

2、請求引數是否被篡改?

3、客戶端請求的唯一性,是否為重複請求攻擊(RepeatAttack)?

傳統的Session認證方式

在傳統的web應用中,服務端成功相應請求者,返回正常的response依賴於服務端通過一種儲存機制把每個使用者經過認證之後的會話資訊(session)記錄伺服器端,一般記錄到記憶體、磁碟、資料庫中,這種方式在請求量和使用者量增多的時候無疑會增大服務端的開銷;如果是記錄在記憶體中,那每次請求都分發登到該機器上才能授權獲取資源,那在分散式系統中就存在著問題;因為是基於Cookie的,如果Cookie被截獲,攻擊者會盜用身份資訊進行傳送惡意請求,也就是“跨站請求偽造”(CSRF)。

基於token的認證方式

客戶端用使用者名稱和密碼經過伺服器認證之後,伺服器會簽發一個token返回給客戶端,客戶端儲存token(一般存在請求頭裡),並且在之後的請求裡附帶此token,伺服器每次會解簽名token,驗證通過則返回資源。另外服務端要支援CORS跨來源資源共享)策略,伺服器處理完請求之後,會再返回結果中加上Access-Control-Allow-Origin。

jwt的生成

token是介面的令牌,好比去衙門辦事,“衙門口朝南開,有理無錢莫進來”。沒有令牌就別想辦事。token的驗證方法很多,也生成了很多標準,jwt就是一種基於json的RFC 7519。該標準由三部分組成:

  • header

  • payload

  • signature

header和payload經過base64編碼後用點拼接起來。signature是把header和payload編碼和拼接後經過加密演算法加密,加密時還要一個密碼,這個密碼儲存在伺服器端。大致示意圖如下:

Header:

head由兩部分組成,一個是token型別,一個是使用的演算法,如下型別為jwt,使用的演算法是HS256。當然,還有HS384、HS512演算法。

{
 "typ": "JWT",
 "alg": "HS256"
}

將以上json進行base64編碼,當然編碼前將json去格式化,如圖:

生成的編碼為:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

用go語言實現:

package main

import (
 "fmt"
 "encoding/base64"
)

func main() {

 head1 := `{"typ":"JWT","alg":"HS256"}`

 fmt.Println(base64.StdEncoding.EncodeToString([]byte(head1)))
}

Payload:

payload 裡面是 token 的具體內容,這些內容裡面有一些是標準欄位,我們也可以新增自定義內容。如下:

{
   "iss": "smallsoup",
   "iat": 1528902195,
   "exp": 1528988638,
   "aud": "www.smallsoup.com",
   "sub": "[email protected]",
   "userId": "0418"
}

這裡面的前五個欄位都是由JWT的標準所定義的,在jwt標準中都可以找到。

  • iss: 該JWT的簽發者

  • sub: 該JWT所面向的使用者

  • aud: 接收該JWT的一方

  • exp(expires): 什麼時候過期,這裡是一個Unix時間戳

  • iat(issued at): 在什麼時候簽發的

最後一個userId表示了使用者資訊,為自定義欄位,我們也可以定義角色等其他欄位。以上的json去格式化後的base64編碼如下:

eyJpc3MiOiJzbWFsbHNvdXAiLCJpYXQiOjE1Mjg5MDIxOTUsImV4cCI6MTUyODk4ODYzOCwiYXVkIjoid3d3LnNtYWxsc291cC5jb20iLCJzdWIiOiJzbWFsbHNvdXBAcXEuY29tIiwidXNlcklkIjoiMDQxOCJ9

Signature:

JWT 的最後一部分是 Signature ,這部分內容有三個部分,先是用 Base64 編碼的 header.payload ,再用加密演算法加密一下,加密的時候要放進去一個 Secret ,這個相當於是一個密碼,這個密碼祕密地儲存在服務端。

  • header

  • payload

  • secret

假設這裡secret為mysecret,則用go語言實現程式碼如下:

package main

import (
 "fmt"
 "encoding/base64"
 "crypto/hmac"
 "crypto/sha256"
 "strings"
)

func main() {

 head1 := `{"typ":"JWT","alg":"HS256"}`

 head1Base64 := base64.StdEncoding.EncodeToString([]byte(head1))

 payload1 := `{"iss":"smallsoup","iat":1528902195,"exp":1528988638,"aud":"www.smallsoup.com","sub":"[email protected]","userId":"0418"}`

 payload1Base64 := base64.StdEncoding.EncodeToString([]byte(payload1))

 encodedstring := head1Base64 + "." + payload1Base64

 hash := hmac.New(sha256.New, []byte("mysecret"))
 hash.Write([]byte(encodedstring))

 signature := strings.TrimRight(base64.URLEncoding.EncodeToString(hash.Sum(nil)), "=")

 fmt.Printf(signature)
}

執行結果為:

fjjbA93FTcE71hz_cyIzCUFYdTdyl9hA0w7Pa0ltduc

最後這個在服務端生成並且要傳送給客戶端的 Token 看起來像這樣:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzbWFsbHNvdXAiLCJpYXQiOjE1Mjg5MDIxOTUsImV4cCI6MTUyODk4ODYzOCwiYXVkIjoid3d3LnNtYWxsc291cC5jb20iLCJzdWIiOiJzbWFsbHNvdXBAcXEuY29tIiwidXNlcklkIjoiMDQxOCJ9.fjjbA93FTcE71hz_cyIzCUFYdTdyl9hA0w7Pa0ltduc

實際上https://jwt.io/這個網站提供了這個能力,以及各種語言的生成token和解密token的庫。

go語言生成token和解析token:

下面是go語言版的生成token和解析token的案例:

package main

import (
 "github.com/dgrijalva/jwt-go"
 "fmt"
)

func main() {

 hmacSampleSecret := []byte("mysecret")

 // Create a new token object, specifying signing method and the claims
 // you would like it to contain.
 token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
     "iss": "smallsoup",
     "iat": 1528902195,
     "exp": 1528988638,
     "aud": "www.smallsoup.com",
     "sub": "[email protected]",
     "userId": "0418",
 })

 // Sign and get the complete encoded token as a string using the secret
 tokenString, err := token.SignedString(hmacSampleSecret)

 fmt.Println(tokenString, err)

 token, err = jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
   // Don't forget to validate the alg is what you expect:
   if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
     return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
   }

   // hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key")
   return hmacSampleSecret, nil
 })

 if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
   fmt.Println(claims)
 } else {
   fmt.Println(err)
 }
}

具體可以瞭解github上以下程式碼的實現。

go get github.com/dgrijalva/jwt-go


本公眾號免費提供csdn下載服務,海量IT學習資源,如果你準備入IT坑,勵志成為優秀的程式猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大資料、面試資料、前端 等資源。同時我們組建了一個技術交流群,裡面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號後臺回覆【2】,免費邀請加技術交流群互相學習提高,會不定期分享程式設計IT相關資源。


掃碼關注,精彩內容第一時間推給你

相關推薦

json web token應用

Json Web Token (JWT),是一個非常輕巧的規範,這個規範允許在網路應用環境間客戶端和伺服器間較安全的傳遞資訊。該token被設計為緊湊且安全的,特別適用於分散式站點的單點登入(SSO)場景。JWT一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源。

JSON Web Token - 在Web應用間安全地傳遞信息

tps 數據 symbol 五個 example 分享 不可 什麽 attr JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息。 讓我們來假想一下一個場景。在A用戶關註了B用戶的時候,系統發郵件給B用

理解JWT(JSON Web Token)認證python實踐

原文:https://segmentfault.com/a/1190000010312468?utm_source=tag-newest 幾種常用的認證機制 HTTP Basic Auth HTTP Basic Auth 在HTTP中,基本認證是一種用來允許Web瀏覽器或其他客戶端程式在請求時

JSON Web Token (JWT)生成Token解密實戰。

昨天講解了JWT的介紹、應用場景、優點及注意事項等,今天來個JWT具體的使用實踐吧。 從JWT官網支援的類庫來看,jjwt是Java支援的演算法中最全的,推薦使用,網址如下。 下面來看看如何使用jjwt來實現JWT token的生成與解密,主要用到sha

JSON Web Token (JWT)生成Token解密實戰

昨天講解了JWT的介紹、應用場景、優點及注意事項等,今天來個JWT具體的使用實踐吧。從JWT官網支援的類庫來看,jjwt是Java支援的演算法中最全的,推薦使用,網址如下。https://github.com/jwtk/jjwt下面來看看如何使用jjwt來實現JWT toke

一下web移動端基本

5.5 相關 過程 部件 位圖 都是 3.5 柵格 開發 屏幕尺寸、屏幕分辨率、屏幕像素密度 屏幕尺寸: 指屏幕的對角線的長度,單位是英寸,1英寸=2.54厘米。 常見的屏幕尺寸有2.4、2.8、3.5、3.7

使用json web token

undefined this dmi ber sub 數據庫 說明 nat publish 由來 做了這麽長時間的web開發,從JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到現在的nodej

Python Web的五大框架

編程 dex 左右 cpu pytho 在那 一段 Language 缺點 說到Web Framework,Ruby的世界Rails一統江湖,而Python則是一個百花齊放的世界。各種micro-framework、framework不可勝數. 盡

[轉]八幅漫畫理解使用JSON Web Token設計單點登錄系統

漫畫 響應 嘗試 占用 tao 自己的 解碼 -a 發送 上次在《JSON Web Token - 在Web應用間安全地傳遞信息》中我提到了JSON Web Token可以用來設計單點登錄系統。我嘗試用八幅漫畫先讓大家理解如何設計正常的用戶認證系統,然後再延伸到單點登錄系統

利用Redis撤銷JSON Web Token產生的令牌

redis數據庫 pre 是否 pop 實例 撤銷 logo send .post 利用Redis撤銷JSON Web Token產生的令牌 作者:chszs。版權全部。未經允許,不得轉載。博主主頁:http://blog.csdn.net/chszs

文件解析上傳漏洞

文件上傳漏洞 文件解析漏洞 中國菜刀 在web滲透中,我最期待兩種漏洞,一種是任意命令執行漏洞,如struct2漏洞等;另一種是文件上傳漏洞,因為這兩種漏洞都是獲取服務器權限最快最直接的方法。而對於任意命令執行漏洞,如果是通過內網映射出來的,那麽可能還需要使用不同的手段進行木馬文件上傳,從而獲取

車牌識別技術的應用

車牌識別技術的應用由來已久,車牌識別增加了車輛管理識別的速度,減少了擁堵,提高了大家的出行舒適度。對於在OCR識別技術領域有著十多年研發經驗的廈門雲脈來說,如何提高車牌識別的準確率,實現更精確的識別更是市場所需。 所以,雲脈自主研發推出的車牌識別技術,基於成熟的OCR技術,以計算機視覺處理、

php錯誤提示查錯方法

error 設置斷點 bugs notice -- 語法 打開 tin 開始 php有哪幾種錯誤提示 1.notice : 註意 2.waring : 警告 3.error : 錯誤 PHP中都有哪幾種查錯方法? 1、語法檢查--php配置文件裏,把錯誤顯示選項都打開或者代

大型web系統架構

memcache hbm 設備 應用服務器 syn sql 執行 效率 color CSDN文章:淺談大型web系統架構(丁碼農) 動態應用,是相對於網站靜態內容而言,是指以c/c++、php、Java、perl、.net等服務器端語言開發的網絡應用軟件,比如論壇、網絡相冊

什麽是JWT(JSON WEB TOKEN

加密 string style 直接 協議 策略 ade aud images 什麽是JWT Json web token(JWT)是為了網絡應用環境間傳遞聲明而執行的一種基於JSON的開發標準(RFC 7519),該token被設計為緊湊且安全的,特別適用於分

JWT--JSON WEB TOKEN

hmac 授權 消費者 隨著 相關 數據 cors 服務器端 容易 轉自簡書 http://www.jianshu.com/p/576dbf44b2ae 什麽是JWT Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標

javascript的原型原型鏈

枚舉 實例對象 ole 技術分享 num code 更改 actions 機制 淺談javascript的原型及原型鏈 這裏,我們列出原型的幾個概念,如下: prototype屬性 [[prototype]] __proto__ prototype屬性 只要創建

Python web框架

title 簡介 安裝 epo 完整 模塊 意思 數據庫 urb 一、Python web框架   Web Framework,Ruby的世界Rails一統江湖,而Python則是一個百花齊放的世界,各種micro-framework、framework不可勝數,不完全列

JWT(JSON WEB TOKEN) / oauth2 / SSL

bash 字符 維護 ssl 信息 簡單 角色 ron 保存會話 1: JWT:   為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來

JWT JSON Web Token

bubuko 可靠的 分組 使用 dig pan alt 可靠 stringify JWT(JSON Web Token) 允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息的規範。 JWT由三個部分組成:header(頭部)、payload(載荷)、signature