JWT 全稱 JSON Web Tokens ,是一種規(guī)范化的 token。是對 token 這一技術(shù)提出一套規(guī)范。
JWT的結(jié)構(gòu)
頭部(header)
載荷(Payload)
簽名(Signature)
Header
頭部包含了兩部分,采用的簽名算法和token 類型
{
"alg": "HS256",
"typ": "JWT"
}
Payload
這部分就是我們存放信息的地方了屡立,你可以把用戶 ID 等信息放在這里(當(dāng)然用戶ID推薦加密后存放),JWT 規(guī)范里面對這部分有進(jìn)行了比較詳細(xì)的介紹搀军,常用的由 iss(簽發(fā)者)膨俐,iat(簽發(fā)時間),exp(過期時間)罩句,sub(面向的用戶)焚刺,aud(接收方)。
{
"iss": "lion1ou JWT",
"iat": 1441593502,
"exp": 1441594722,
"aud": "www.example.com",
"sub": "example@163.com"
}
Signature
Header 和 Payload 編碼后的字符串拼接后再用HS256簽名算法
(Header中alg指明的算法)加密门烂,在加密的過程中還需加上secret(密鑰)乳愉,最后得到簽名
Tips:Base64是一種編碼兄淫,并不是一種加密過程,不具備安全性蔓姚,所以敏感信息別放入其中
JWT 生成 TOKEN
- header json 的 base64 編碼為令牌第一部分
- payload json 的 base64 編碼為令牌第二部分
- 拼裝第一捕虽、第二部分編碼后的 json 以及 secret 進(jìn)行簽名的令牌的第三部分
偽代碼如下:
// 頭部
header = '{"alg":"HS256","typ":"JWT"}'
// 載荷
payload = '{"loggedInAs":"admin","iat":1422779638}'
// 對 header 和 payload 分別進(jìn)行 base64 編碼后拼接起來進(jìn)行 hash 運算得到簽名
signature = HMAC-SHA256(encodeBase64Url(header) + "." + encodeBase64Url(payload),secret)
// 最后將三部分進(jìn)行 base64 編碼后再拼接即可得到 token坡脐。
json_web_token = encodeBase64Url(header) + '.' + encodeBase64Url(payload) + '.' + encodeBase64Url(signature)
JWT 使用
請求
- url 參數(shù):?token=你的token
- header 中:Authorization:Bearer <token>(推薦)
注意Bearer和token之間有一個空格
接收
前端接收到后端返回的 token 后進(jìn)行存儲薯鳍,一般存儲在:
- LocalStorage
- SessionStorage
- Cookie
JWT 的優(yōu)勢和問題
優(yōu)勢
- 防 CSRF
- 適合移動應(yīng)用
- 無狀態(tài)的 RESTful API
- 一次性驗證(如郵件激活)
問題
- 續(xù)簽問題
- 注銷問題
JWT 安全
- 使用 HTTPS
- 縮短 token 有效時間
- 定期更新密鑰
- 使用HttpOnly屬性來防止Cookie被JavaScript讀取,防止 XSS 攻擊竊取 cookie
- 不要在token中編碼敏感信息挨措,如果一定會有那必須先加密再進(jìn)行編碼
- 根據(jù)需要可將用戶 IP 放入 Payload 進(jìn)行校驗