[JWT] 甚麼是 JWT

  • 9747
  • 0
  • JWT
  • 2021-03-22

簡易記錄一下自己知道的

甚麼是 JWT 

  • Json web token 縮寫為 JWT
  • 為了在網絡應用環境間傳遞 Claim,基於JSON的標準(RFC 7519)
  • Claim 可以包含身分、角色、業務邏輯所需要的旗標...等,但不要存放機密資料
  • 簽章方式可以使用Secret (HMAC algorithm)或是RSA、ECDSA
  • 透過雜湊簽章來確保資料沒有被變更過
  • 可用於認證
  • 分為三部分header、payload和signature,並使用"點"( . )將三個部分連結起來成為一個字串

header

  1. typ:類型,JWT
  2. alg:加密演算法
  3. JSON 範例:{'typ': 'JWT', 'alg': 'HS256'}
  4. 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範例

  1. {
    "sub": "1234567890",  "name": "John Doe",  "admin": true}
  2. 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

Image result for microsoft+mvp+logo