[筆記] JSON Web Token (JWT)

2023/09/21閱讀時間約 5 分鐘

最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。

例如:  BreezePassport 、  Socialite 、 SanctumFortifyJetstream

而之前跟著線上課程學習到都是使用 Passport 套件,跟著官方文件套用並實現會員系統,或是無腦安裝 Breeze 但仔細研究後,Passport 可用於實現 OAuth 2.0 和 JWT 身份驗證,其支持各種 OAuth 2.0 授權,並有內置的用戶身份驗證和令牌管理機制,但如果只需要一種輕量級的身份驗證機制,例如在前端和後端之間驗證用戶身份,或在不同的微服務之間進行身份驗證和授權,那其實單純選擇JWT會更方便些,下列就針對JWT學習理解作筆記。

簡單說明何為JWT?

JWT (JSON Web Token) 是一種開放標準(RFC 7519),用於在不同實體之間安全地傳遞信息的輕量級標準。它使用簽名(或加密)來確保數據的完整性和安全性。

而它的設計因為不需要使用傳統身份驗證方法(使用Cookie或Session),而是在客戶端登入後請求時,帶上資料請求伺服器驗證,驗證完成後會給予Token回傳給客戶端,而之後客戶端發出任何請求時都會帶上這段Token 給伺服器端驗證往後執行,整個流程大致如下圖(簡單用Hackmd畫一下XD)

raw-image

JWT結構

JWT 由三部分組成,它們都是基於Base64編碼的字符串,並使用點(.)來分隔:

  1. Header:描述令牌的元信息,通常包括令牌的類型(JWT)和所使用的簽名算法。
  2. Payload:包含有關令牌的信息,例如用戶ID、角色等。這部分是可讀的,但不應包含敏感信息
  3. Signature:用於驗證令牌的完整性和真實性的數字簽名。通常使用一個密鑰來生成簽名。

而在 JSON Web Tokens (JWT) 中,簽名(Signature)是用於確保令牌完整性和真實性的重要部分。簽名通常使用密鑰進行生成和驗證,並且可以使用不同的加密算法。以下是一些常見的簽名加密算法:

  1. HMAC(基於散列的消息驗證碼)
    • HMAC SHA-256(HMAC-SHA256):這是一種使用 SHA-256 散列函數的 HMAC 簽名算法。它是 JWT 中最常見的簽名算法之一。
  2. RSA(Rivest–Shamir–Adleman)
    • RSA 簽名算法使用非對稱密鑰對來生成和驗證簽名。在 JWT 中,用於生成簽名的是私鑰,而用於驗證簽名的是公鑰。
    • 常見的 RSA 簽名算法包括 RS256、RS384 和 RS512,分別使用不同的散列函數(SHA-256、SHA-384 和 SHA-512)。
  3. ECDSA(橢圓曲線數位簽名算法)
    • ECDSA 是一種基於橢圓曲線密碼學的簽名算法,類似於 RSA。它使用非對稱密鑰對來生成和驗證簽名。
    • 常見的 ECDSA 簽名算法包括 ES256、ES384 和 ES512,分別使用不同的橢圓曲線和散列函數。

最後組成結果就會變成下列這個合法簽發的JWT字串。

base64(Header) + base64(Payload) + base64(Signature)


而透過JWT官網:https://jwt.io/,可以用來解析JWT字串decode結果。

使用JWT優缺點

  1. JWT 包含了所有必要的信息,包括用戶ID、角色、到期時間等,因此減少了對伺服器的請求次數,提高了效率。
  2. 由於JWT是JSON object的形式,故大部分的程式語言皆支援,可以在不同的語言和平台之間輕松使用和解析。
  3. 當使用適當的加密算法和密鑰管理實踐時,JWT 可以提供良好的安全性,確保令牌的完整性和真實性。
  4. JWT 可以包含自定義的聲明(Claims),這允許您在令牌中添加應用程序特定的信息。這提供了擴展性,以滿足特定應用程序需求。

缺點:

  1. 一旦 JWT 被簽發,除非到期時間到期,否則無法撤銷。這對於某些安全需求較高的應用程序可能是一個問題。
  2. JWT 的有效載荷(Payload)包含了用戶信息,因此可能會變得相對較大。如果用戶信息很多,令牌可能會變得非常大,這可能會增加傳輸成本。
  3. 保護 JWT 的安全性依賴於密鑰的安全管理。如果密鑰泄露或不慎遺失,則可能導致令牌被濫用。

總結:JWT 是實現單點登錄的有效工具,它提供了一種安全且可擴展的方式,允許用戶在多個應用程序之間無縫訪問,而不需要在每個應用程序中重新登錄,故很多跨網域的 SSO(Single Sign-On) 實作就會使用 JWT 這樣的機制,也避免了 session 所造成的問題。

下一章就要來使用 firebase/php-jwt 套件來進行實作會員登入登出功能


可以參考五倍紅寶石的JWT文章會有更詳細的說明

https://5xruby.tw/posts/what-is-jwt

文章同步發佈potato media平台

https://www.potatomedia.co/post/504ee23d-ab10-47d9-8b7d-a9dc84cc9c70






13會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
發表第一個留言支持創作者!