五分鐘帶你了解啥是JWT

2021-10-10 22:11:27 字數 2715 閱讀 5877

json web token (jwt)是乙個開放標準(rfc 7519),它定義了一種緊湊的、自包含的方式,用於作為json物件在各方之間安全地傳輸資訊。該資訊可以被驗證和信任,因為它是數字簽名的。
下列場景中使用json web token是很有用的:

json web token由三部分組成,它們之間用圓點(.)連線。這三部分分別是:

因此,乙個典型的jwt看起來是這個樣子的:

***xx.yyyyy.zzzzz
接下來,具體看一下每一部分:

例如:

然後,用base64對這個json編碼就得到jwt的第一部分

對payload進行base64編碼就得到jwt的第二部分

注意,不要在jwt的payload或header中放置敏感資訊,除非它們是加密的。

為了得到簽名部分,你必須有編碼過的header、編碼過的payload、乙個秘鑰,簽名演算法是header中指定的那個,然對它們簽名即可。
例如:

hmacsha256(base64urlencode(header) + "." + base64urlencode(payload), secret)
簽名是用於驗證訊息在傳遞過程中有沒有被更改,並且,對於使用私鑰簽名的token,它還可以驗證jwt的傳送方是否為它所稱的傳送方。

看一張官網的圖就明白了:

在認證的時候,當使用者用他們的憑證成功登入以後,乙個json web token將會被返回。此後,token就是使用者憑證了,你必須非常小心以防止出現安全問題。一般而言,你儲存令牌的時候不應該超過你所需要它的時間。

無論何時使用者想要訪問受保護的路由或者資源的時候,使用者**(通常是瀏覽器)都應該帶上jwt,典型的,通常放在authorization header中,用bearer schema。

header應該看起來是這樣的:

authorization: bearer
伺服器上的受保護的路由將會檢查authorization header中的jwt是否有效,如果有效,則使用者可以訪問受保護的資源。如果jwt包含足夠多的必需的資料,那麼就可以減少對某些操作的資料庫查詢的需要,儘管可能並不總是如此。

如果token是在授權頭(authorization header)中傳送的,那麼跨源資源共享(cors)將不會成為問題,因為它不使用cookie。

5.1 基於伺服器的身份認證

在討論基於token的身份認證是如何工作的以及它的好處之前,我們先來看一下以前我們是怎麼做的:

http協議是無狀態的,也就是說,如果我們已經認證了乙個使用者,那麼他下一次請求的時候,伺服器不知道我是誰,我們必須再次認證
傳統的做法是將已經認證過的使用者資訊儲存在伺服器上,比如session。使用者下次請求的時候帶著session id,然後伺服器以此檢查使用者是否認證過。

這種基於伺服器的身份認證方式存在一些問題:

5.2. jwt與session的差異 相同點是,它們都是儲存使用者資訊;然而,session是在伺服器端的,而jwt是在客戶端的。

session方式儲存使用者資訊的最大問題在於要占用大量伺服器記憶體,增加伺服器的開銷。

而jwt方式將使用者狀態分散到了客戶端中,可以明顯減輕服務端的記憶體壓力。

session的狀態是儲存在伺服器端,客戶端只有session id;而token的狀態是儲存在客戶端。

5.3. 基於token的身份認證是如何工作的 基於token的身份認證是無狀態的,伺服器或者session中不會儲存任何使用者資訊。

沒有會話資訊意味著應用程式可以根據需要擴充套件和新增更多的機器,而不必擔心使用者登入的位置。

雖然這一實現可能會有所不同,但其主要流程如下:

-使用者攜帶使用者名稱和密碼請求訪問 -伺服器校驗使用者憑據 -應用提供乙個token給客戶端 -客戶端儲存token,並且在隨後的每一次請求中都帶著它 -伺服器校驗token並返回資料

注意:-每一次請求都需要token -token應該放在請求header中 -我們還需要將伺服器設定為接受來自所有域的請求,用access-control-allow-origin: *

5.4. 用token的好處 - 無狀態和可擴充套件性:tokens儲存在客戶端。完全無狀態,可擴充套件。我們的負載均衡器可以將使用者傳遞到任意伺服器,因為在任何地方都沒有狀態或會話資訊。 - 安全:token不是cookie。(the token, not a cookie.)每次請求的時候token都會被傳送。而且,由於沒有cookie被傳送,還有助於防止csrf攻擊。即使在你的實現中將token儲存到客戶端的cookie中,這個cookie也只是一種儲存機制,而非身份認證機制。沒有基於會話的資訊可以操作,因為我們沒有會話!

還有一點,token在一段時間以後會過期,這個時候使用者需要重新登入。這有助於我們保持安全。還有乙個概念叫token撤銷,它允許我們根據相同的授權許可使特定的token甚至一組token無效。

博文引用:

五分鐘了解什麼是Openstack

什麼是openstack openstack是全球雲計算技術專家和開發者為公有雲和私有雲聯合協作完成的開源雲計算平台。這個專案通過實現簡單 超大規模以及特性豐富等特點為所有型別的雲提供解決方案。這項技術包含了很多相關的專案用以為雲基礎架構的解決方案提供各種元件。openstack的幕後英雄 由rac...

五分鐘了解CDN

cdn全稱content delivery network,即內容分發網路。其基本思路是盡可能避開網際網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快 更穩定。通過在網路各處放置節點伺服器所構成的在現有的網際網路基礎之上的一層智慧型虛擬網路,cdn系統能夠實時地根據網路流量和各節點...

五分鐘了解Consul

我的誕生也和現在網際網路專案的開發模式有關,從之前的三層架構衍化成現在有微服務架構,把原來bll和dal層做事按業務拆成獨立的分布式服務 其實很多人就是把curd放到單獨的服務中而已 為了高可用 高擴充套件,又把這些服務 程序 集群化,就出現一堆的位址和埠。客戶端由原來的程序內呼叫變成跨程序或跨網路...