簡易記錄一下自己知道的
甚麼是 JWT
- Json web token 縮寫為 JWT
- 為了在網絡應用環境間傳遞 Claim,基於JSON的標準(RFC 7519)
- Claim 可以包含身分、角色、業務邏輯所需要的旗標...等,但不要存放機密資料
- 簽章方式可以使用Secret (HMAC algorithm)或是RSA、ECDSA
- 透過雜湊簽章來確保資料沒有被變更過
- 可用於認證
- 分為三部分header、payload和signature,並使用"點"( . )將三個部分連結起來成為一個字串
header
- typ:類型,JWT
- alg:加密演算法
- JSON 範例:{'typ': 'JWT', 'alg': 'HS256'}
- JSON 被 base64Url 編碼,形成 JWT 的第一部分
payload
這裡就是放你需要傳遞的訊息,你可以用官方定義,也可以自行定義
標準中註冊的聲明 (建議但不強制使用)
- iss(Issuer):頒發者,是區分大小寫的字串,可以是一個字串或是網址
- sub(Subject):主體內容,是區分大小寫的字串,可以是一個字串或是網址
- aud(Audience):觀眾,是區分大小寫的字串,可以是一個字串或是網址
- exp(Expiration Time):Expiration Time,過期時間,是數字日期
- nbf(Not Before):定義在什麼時間之前,不可用,是數字日期
- iat(Issued At):頒發時間,是數字日期
- jti(JWT ID):唯一識別碼,是區分大小寫的字串
公開的claims
隨意定義,不過為了避免衝突,應該在 INNA 定義或者包含命名空間的URI
私有的claims
雙方共同定義
JSON範例
- {
"sub": "1234567890", "name": "John Doe", "admin": true} - JSON 被 base64Url 編碼,形成 JWT 的第二部分
雖然 JWT 可以防止被竄改,但是任何人都可以透過電腦讀取,除非你有加密,否則不要把機密訊息放進 header 或 playload
signature
由三個部分組成
- header (base64Url)
- payload (base64Url)
- secret
- 頒發 jwt、驗證 jwt 的私鑰
- secret 保存在服務端
- 頒發 jwt、驗證 jwt 的也是在服務端
- 不可以流出去
範例:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
工具
http://jwtbuilder.jamiekurtz.com/
參考
https://jwt.io/introduction/
http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
https://github.com/dwyl/learn-json-web-tokens
https://tools.ietf.org/html/rfc7519
https://tools.ietf.org/html/rfc7519#section-4.1
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET