這篇文章會做 JWT介紹 ,讓你了解什麼是JWT,以及JWT使用時機,由那些內容組成,並告訴你JWT的優缺點。
1. JWT介紹
1.1 什麼是JWT?
JWT 的全名是JSON Web Token,是一種開放標準(RFC 7519),它定義了一種簡單穩定的方式來表示身份驗證和授權數據。用於在雙方之間安全地將訊息作為 JSON 物件傳輸,且經過數位簽章 (Digital Signature),因此可以被驗證及信任。可以使用密碼或用一對公鑰/私鑰對 JWT 進行簽章。
1.2 什麼時候要用JWT?
- 授權 (Authorization) 使用者登入後,再次對 Server 端發送請求時,需夾帶著 JWT,Server端根據其token權限決定使用者可以使用的資源。單一登錄 (Single Sign On)廣泛的使用 JWT ,因為它的成本較小並且可以在不同的網域中輕鬆使用。
- 訊息交換 (Information Exchange):JWT可儲存資訊至payload之中,讓我們可以知道是誰發送這個 JWT,並使用密鑰將 header 和 payload 計算簽章,用以驗證內容是否遭到篡改。
1.3 網頁如何用JWT來訪問資源?
- 前端會先透過存取後端的登入API,後端驗證使用者帳密成功後,就會發放合法JWT字串
- 前端拿到JWT字串就會將JWT存放在Local Storage裡面
- 當前端要存取受保護的資源API時,只要在Header的填寫以下內容: Authorization: Bearer <JWT token>
- 後端收到後,會去檢查Authorization的JWT token是否有效,如果有效,則允許前端訪問受保護的資源。 在以前的Session的設計上,Session會存放在Redis等這種快取資料庫,每當使用者訪問受保護的資源時,會先去存取資料庫的Session進行比對,有效則讓使用者存取,以JWT的方式可以降低查詢資料庫的需求。
2. JWT的組成
JWT 的官網裡有一組互動網頁,可以透過這個網站快速檢視及驗證JWT
在 JWT 機制中,驗證成功後發出的憑證包含以下三個部分:
- Header – 標記 token 的類型與雜湊函式名稱。
- alg:對此 JWT 進行簽章和(或)解密的主要演算法。對於未加密的 JWT,此聲明必須設置為
none
。 - 其他可參考
- alg:對此 JWT 進行簽章和(或)解密的主要演算法。對於未加密的 JWT,此聲明必須設置為
- Payload – 要攜帶的資料,例如 user_id 與時間戳記,也可以指定 token 的過期時間。
- 還有其他具有特別意義的claim,可參考官方文件
- Signature – 根據 Header 和 Payload,加上密鑰 (secret) 進行雜湊,產生一組不可反解的亂數,當成簽章,用來驗證 JWT 是否經過篡改。
Header & Payload會經過Base64URL編碼,是可以解碼的,故Payload不能存放敏感資料
3. JWT優缺點
優點:
- 採用JSON object的形式,大部分的程式語言皆支援
- 可存放一些使用者資訊,但並非是敏感的資訊
- 整個JWT,只要Payload不要放過多的資訊,其實Size是相當小的
- 不用在Server的資料庫存放Session,特別適合多台Server的情境下,使得擴展性容易,因為多台Server要使用Session的話,會有共享Session的問題產生,
- 對於現在手機上的APP的應用特別好,使用者不用每次打開APP都要重新輸入帳號與密碼
- 支持跨域請求,不會有傳統用Cookie進行跨域請求等問題
缺點:
- JWT沒辦法主動被中止,也就是說不能像Session一樣被強制無效,但應該還有很多方式可以避免
- JWT一旦洩漏會有很大的安全性的問題,但是洩漏通常會透過兩種方式:
- 駭客使用你的電腦,並得知JWT
- 使用中間人攻擊的方式,擷取客戶端傳送伺服器端的封包,並獲取JWT,但使用HTTPS傳輸可以大幅度降低該攻擊,只要定期更換SSL證書就可以了
4. Auth是獨立Service,要如何驗證?
- 方法一:必須給需要驗證的單位
secret key
,如果此單位是在我們的「可管控的」,比如說:都在同個機器上的Server,就比較沒有安全問題。但如果是跨機器或者第三方這些「較難管控甚至是不可管控」的單位,要分享此key就成了大問題,因為只要此key一流出,Auth-Service所發的token就會被盜用。 - 方法二:驗證這件事情由於是交給「可管控」的Auth-Service,所以不必擔心
secret key
外流的問題,但每次的驗證都需要呼叫一次API,會很浪費時間,所以必須把驗證結果存到快取中,以避免一直無謂的呼叫。 - 方法三:採用方法二,但JWT的簽章演算法使用RS256,將公鑰提供給應用程式,應用程式透過公鑰驗證token是否有被篡改,此方法不會像方法一洩漏私鑰,也不需要像方法二要持續呼叫Auth Service
5. 結論
謝謝各位讀者看到這裡,這篇文章介紹了JWT的相關內容
若你有任何其他分享或是任何建議,也歡迎您在下方留言告訴我以及分享給其他人唷
若你覺得文章對你很有幫助,歡迎在網頁右方填入你的email訂閱本站唷
參考資料: