jwt 全稱 json web tokens , 是乙個非常輕巧的規範。這個規範允許我們使用 jwt 在使用者和伺服器之間傳遞安全可靠的資訊.
jwt 預設是不加密的,任何人都可以解密出來讀到,所以不要把秘密資訊放在裡面。
它的兩大使用場景是:認證和資料交換
jwt由三部分組成:
加粗樣式部分是乙個json物件,通常如下的樣子,使用的時候需要 base64url 演算法轉成字串。
alg屬性表示簽名的演算法(algorithm),預設是 hmac sha256(寫成 hs256);typ屬性表示這個令牌(token)的型別(type),jwt 令牌統一寫為jwt。
如下官方規定了的7個字段,其他需要更多字段可以自定義。使用的時候需要 base64url 演算法轉成字串。
其中包含claims。claims是關於實體(常用的是使用者資訊)和其他資料的宣告,claims有三種型別: registered, public, and private claims。
public claims:自定義claims,注意不要和jwt登錄檔中的屬性衝突即可,常放的是使用者資訊。
private claims:自定義的claims,用於在同意使用這些claims的各方之間共享資訊,它們既不是registered claims,也不是public claims。
官方的屬性字段:iss (issuer):簽發人
exp (expiration time):過期時間
sub (subject):主題 (jwt所面向的使用者)
aud (audience):受眾 (接收jwt的一方)
nbf (not before):生效時間 ( 在***日期之間,該jwt都是可用的)
iat (issued at):簽發時間
jti (jwt id):編號 (jwt的唯一身份標識)
如下自定義字段
signature 部分是對前兩部分的簽名,防止資料篡改。
需要自己在伺服器指定乙個金鑰(secret),並且這個金鑰只儲存在伺服器,使用第一部分header裡面指定的演算法(預設是hmac sha256 簡稱hs256),按照下面公式產生簽名
hmacsha256(
base64urlencode(header) + "." +
base64urlencode(payload),
secret)
最後算出簽名signature 以後,把 header、payload、signature 三個部分拼成乙個字串,每個部分之間用"點"(.)分隔,就可以返回給使用者。如下格式
jwt 的幾個特點
(1)jwt 預設是不加密,但也是可以加密的。生成原始 token 以後,可以用金鑰再加密一次。
(2)jwt 不加密的情況下,不能將秘密資料寫入 jwt。
(3)jwt 不僅可以用於認證,也可以用於交換資訊。有效使用 jwt,可以降低伺服器查詢資料庫的次數。
(4)jwt 的最大缺點是,由於伺服器不儲存 session 狀態,因此無法在使用過程中廢止某個 token,或者更改 token 的許可權。也就是說,一旦 jwt 簽發了,在到期之前就會始終有效,除非伺服器部署額外的邏輯。
(5)jwt 本身包含了認證資訊,一旦洩露,任何人都可以獲得該令牌的所有許可權。為了減少盜用,jwt 的有效期應該設定得比較短。對於一些比較重要的許可權,使用時應該再次對使用者進行認證。
(6)為了減少盜用,jwt 不應該使用 http 協議明碼傳輸,要使用 https 協議傳輸。
因為jwt 的 token 相當是明文,是可以解密的,任何存在 payload 的東西,都沒有秘密可言,所以隱私資料不能簽發 token。
注意:一般是第一步獲取userid這類使用者基本的識別資訊,第二步確實是否過期,第三步是防止token被串改
如果加強 jwt 的安全性? 總結以下幾點:
一定要儲存好服務端的secret,防止洩露給客戶端。
縮短 token 有效時間
使用安全係數高的加密演算法
token 不要放在 cookie 中,有 csrf 風險
使用 https 加密協議
對標準字段 iss、sub、aud、nbf、exp 進行校驗
使用成熟的開源庫,不要手賤造輪子
特殊場景下可以把使用者的 ua、ip 放進 payload 進行校驗(不推薦)
Latex使用小結(1)
最近在用latex寫 排版格式,之前一直用word,大多數情況下用word處理常見格式的文件還是很方便的,但是當進行學術 寫作,依照 的指定格式並且加入規範的公式 圖表 參考文獻等的時候,latex要更加精準一些。初次使用,難免會遇到一些問題,在用latex完成一篇 的格式修改後,把遇到的一些小問題...
比較器的使用小結1
取前k個最小元素 建立大根堆 利用比較器修改優先佇列規則 大根堆中,每次放入的元素小於堆頂,則堆彈出堆頂,並加入新元素 大根堆最後儲存的就是前k個最小元素。public class topk for int i 0 i array.length i else if maxheap.peek arra...
TCP IP詳解學習筆記 1 基本概念
在世界上各地,各種各樣的電腦執行著各自不同的作業系統為大家服務,這些電腦在表達同一種資訊的時候所使用的方法是千差萬別。就好像聖經中上帝打亂了各地人的口音,讓他們無法合作一樣。計算機使用者意識到,計算機只是單兵作戰並不會發揮太大的作用。只有把它們聯合起來,電腦才會發揮出它最大的潛力。於是人們就想方設法...