最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。
例如: Breeze 、Passport 、 Socialite 、 Sanctum、Fortify、Jetstream
而之前跟著線上課程學習到都是使用 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)
。

JWT結構:
JWT 由三部分組成,它們都是基於Base64編碼的字符串,並使用點(.
)來分隔:
- Header:描述令牌的元信息,通常包括令牌的類型(JWT)和所使用的簽名算法。
- Payload:包含有關令牌的信息,例如用戶ID、角色等。這部分是可讀的,
但不應包含敏感信息
。 - Signature:用於驗證令牌的完整性和真實性的數字簽名。通常使用一個密鑰來生成簽名。
而在 JSON Web Tokens (JWT) 中,簽名(Signature)是用於確保令牌完整性和真實性的重要部分。簽名通常使用密鑰進行生成和驗證,並且可以使用不同的加密算法。以下是一些常見的簽名加密算法:
- HMAC(基於散列的消息驗證碼):
- HMAC SHA-256(HMAC-SHA256):這是一種使用 SHA-256 散列函數的 HMAC 簽名算法。它是 JWT 中最常見的簽名算法之一。
- RSA(Rivest–Shamir–Adleman):
- RSA 簽名算法使用非對稱密鑰對來生成和驗證簽名。在 JWT 中,用於生成簽名的是私鑰,而用於驗證簽名的是公鑰。
- 常見的 RSA 簽名算法包括 RS256、RS384 和 RS512,分別使用不同的散列函數(SHA-256、SHA-384 和 SHA-512)。
- ECDSA(橢圓曲線數位簽名算法):
- ECDSA 是一種基於橢圓曲線密碼學的簽名算法,類似於 RSA。它使用非對稱密鑰對來生成和驗證簽名。
- 常見的 ECDSA 簽名算法包括 ES256、ES384 和 ES512,分別使用不同的橢圓曲線和散列函數。
最後組成結果就會變成下列這個合法簽發的JWT字串。
base64(Header) + base64(Payload) + base64(Signature)
而透過JWT官網:https://jwt.io/,可以用來解析JWT字串decode結果。
使用JWT優缺點
- JWT 包含了所有必要的信息,包括用戶ID、角色、到期時間等,因此減少了對伺服器的請求次數,提高了效率。
- 由於JWT是JSON object的形式,故大部分的程式語言皆支援,可以在不同的語言和平台之間輕松使用和解析。
- 當使用適當的加密算法和密鑰管理實踐時,JWT 可以提供良好的安全性,確保令牌的完整性和真實性。
- JWT 可以包含自定義的聲明(Claims),這允許您在令牌中添加應用程序特定的信息。這提供了擴展性,以滿足特定應用程序需求。
缺點:
- 一旦 JWT 被簽發,除非到期時間到期,否則無法撤銷。這對於某些安全需求較高的應用程序可能是一個問題。
- JWT 的有效載荷(Payload)包含了用戶信息,因此可能會變得相對較大。如果用戶信息很多,令牌可能會變得非常大,這可能會增加傳輸成本。
- 保護 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