你知道你對 JSON Web Token 的認識存在誤區嗎

1.前言

JSON Web Token (JWT) 其實目前已經廣爲軟件開發者所熟知了,可是 JOSE (Javascript Object Signing and Encryption) 卻鮮有人知道,我第一次知道它是在 Spring Security 的官方文檔中,它改變了我對 JWT 的一些認識。目前國內能找到相關中文資料不是太多。因此我以爲有必要概括一下。算法

2. JOSE 概述

JOSE 是一種旨在提供在各方之間安全傳遞聲明(claims)的方法的規範集。咱們經常使用的 JWT 就包含了容許客戶端訪問特定應用下特定資源的聲明。JOSE 制定了一系列的規範來達到此目的。目前該規範還在不斷的發展,咱們經常使用的包含如下幾個 RFC :spring

  • JWS(RFC 7515) -JSON Web簽名,描述生成和處理簽名消息
  • JWE(RFC 7516) -JSON Web加密,描述了保護和處理加密 消息
  • JWK(RFC 7517) -JSON Web密鑰,描述 Javascript 對象簽名和加密中加密密鑰的 格式和處理
  • JWA(RFC 7518) -JSON Web算法,描述了 Javascript 對象簽名和加密中使用的 加密 算法
  • JWT(RFC 7519) -JSON Web令牌,描述以 JSON 編碼並由 JWSJWE 保護的聲明的表示形式

3. 咱們都看錯了 JWT

看了對 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) 。它們之間的關係應該是這樣的:編碼

4. 什麼是 JWE

JWS 咱們就不說了,就是一般咱們所說的 JWT。包括以前我在 Spring Security 實戰乾貨 中所涉及到的 JWT 都是 JWS。咱們來講一下 JWEJWS 僅僅是對聲明(claims)做了簽名,保證了其不被篡改,可是其 payload(中段負載) 信息是暴露的。也就是 JWS 僅僅能保證數據的完整性而不能保證數據不被泄露。因此我之前也說過它不適合傳遞敏感數據。
JWE 的出現就是爲了解決這個問題的。具體的能夠看下圖:加密

從上面能夠看出 JWE 的生成很是繁瑣,做爲 Token 可能比較消耗資源和耗時。用做安全的數據傳輸途徑應該不錯。spa

5. Spring Security jose 相關

這裏須要簡單提一下 Spring Security 提供了 JOSE 有關的類庫 spring-security-oauth2-jose ,你可使用該類庫來使用 JOSE 。若是 Java 開發者要在 Spring Security 安全框架中使用 OAuth2.0 ,這個類庫也是須要研究一下的。code

6. 總結

今天咱們對 JOSE 這個相對陌生的概念進行了認識,對 JOSE 規範集中的幾個重要的 RFC 進行了列舉。對以前的侷限性認識也進行了糾正。爲咱們後續的 OAuth2.0 相關學習進行了鋪墊。 對象

關注公衆號:Felordcn 獲取更多資訊

我的博客:https://felord.cn

相關文章
相關標籤/搜索