因為只使用過 ip 白名單來限制 ip 的存取,一直都沒有機會使用到JWT,但之前有自學了解一下要如何使用,透過這次鐵人賽剛好把學習的整理複習一下,並嘗試應用在 Python 框架上。
JWT(Json Web Token) 是一種開放標準(RFC 7519),格式為 JSON,它主要的目的是確保訊息在網路傳輸過程中的完整性和有效性,比較常被使用在驗證和授權。
主要執行的方式,是使用者登入後會跟伺服器索取 JWT,並將 JWT 儲存在本地端(如 localStorage 或 sessionStorage)並在每次發起請求時附加到 Authorization header中,就不用在重複輸入密碼,直到該JWT 過期。
JWT 由三個部分組成:
Header:
包含加密的演算法(如 HS256)和 token 類型(JWT)。
{
"alg": "HS256",
"typ": "JWT"
}
Payload:
主要放的是claims(聲明)的內容,也就是主要想要傳遞的訊息。claims 主要分為 Registered claims、Public claims 或 Private claims。
1. Registered Claims
Registered Claims 主要放的是一些常用公認的一些訊息。
e.g. :
2. Public Claims
Public Claims 主要指的是有在 IANA JSON Web Token 註冊的聲明。
3. Private Claims
Private Claims 是自行定義的 Claims,這些 Claims 不需要在 IANA JSON Web Token中進行註冊,但需要與所有使用該 token 的使用者達成共識。
e.g. :
e.g. :
{
"iss": "https://example.com", // Registered Claims
"sub": "0000000001", // Registered Claims
"aud": "https://example.com", // Registered Claims
"exp": 1694131200, // Registered Claims
"nbf": 1694044800, // Registered Claims
"iat": 1694044800, // Registered Claims
"jti": "00000009", // Registered Claims
"role": "admin", // Public Claims
"name": "Yusinz", // Public Claims
"user_id": "123456", // Private Claims
"department": "Engineering", // Private Claims
}
使用 Payload 的注意事項
Signature:
用來驗證 token 的完整性和真實性。Signature 是通過對 Header 和 Payload 進行編碼,並使用秘密(或私鑰)進行簽名來生成的。
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
JWT的優點
需注意的點
這些雖然是需要注意的點,但其實都有一些解法,只是這裡就不多解釋,有興趣深入了解的,google 應該就很多答案了!
最後推薦可以去一個網站,他可以在裡面分析和產生 JWT ,實際嘗試更能了解實際是如何運作的!