JSON Web Token (JWT) 其實目前已經廣爲軟件開發者所熟知了,可是 JOSE (Javascript Object Signing and Encryption) 卻鮮有人知道,我第一次知道它是在 Spring Security 的官方文檔中,它改變了我對 JWT 的一些認識。目前國內能找到相關中文資料不是太多。因此我以爲有必要概括一下。算法
JOSE 是一種旨在提供在各方之間安全傳遞聲明(claims)的方法的規範集。咱們經常使用的 JWT 就包含了容許客戶端訪問特定應用下特定資源的聲明。JOSE 制定了一系列的規範來達到此目的。目前該規範還在不斷的發展,咱們經常使用的包含如下幾個 RFC :spring
看了對 JWT 的描述中提到 「令牌以 JWS 或者 JWE 聲明表示」。莫非我以前的認知是錯誤的嗎? 找了一些官方的資料研究了一番後,確實我以前的認知是不夠全面的。安全
官方定義:框架
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties
直譯過來:JSON Web令牌(JWT)是一種緊湊的URL安全方法,用於表示要在兩方之間轉移的聲明。學習
也就是說咱們一般說的 JWT 其實是一個對聲明進行 JOSE 處理方式的統稱。咱們以前用的應該叫 JWS(JSON Web Signature),是 JWT 的一種實現,除了 JWS , JWT 還有另外一種實現 JWE(JSON Web Encryption) 。它們之間的關係應該是這樣的:編碼
JWS 咱們就不說了,就是一般咱們所說的 JWT。包括以前我在 Spring Security 實戰乾貨 中所涉及到的 JWT 都是 JWS。咱們來講一下 JWE 。JWS 僅僅是對聲明(claims)做了簽名,保證了其不被篡改,可是其 payload(中段負載) 信息是暴露的。也就是 JWS 僅僅能保證數據的完整性而不能保證數據不被泄露。因此我之前也說過它不適合傳遞敏感數據。
JWE 的出現就是爲了解決這個問題的。具體的能夠看下圖:加密
從上面能夠看出 JWE 的生成很是繁瑣,做爲 Token 可能比較消耗資源和耗時。用做安全的數據傳輸途徑應該不錯。spa
這裏須要簡單提一下 Spring Security 提供了 JOSE 有關的類庫 spring-security-oauth2-jose
,你可使用該類庫來使用 JOSE 。若是 Java 開發者要在 Spring Security 安全框架中使用 OAuth2.0 ,這個類庫也是須要研究一下的。code
今天咱們對 JOSE 這個相對陌生的概念進行了認識,對 JOSE 規範集中的幾個重要的 RFC 進行了列舉。對以前的侷限性認識也進行了糾正。爲咱們後續的 OAuth2.0 相關學習進行了鋪墊。 對象
關注公衆號:Felordcn 獲取更多資訊