摘要:簡稱,在通信過程中,進行身份認證。服務器完全只靠這個對象認定用戶身份。規定了個官方字段,供選用。
1. JSON WEB TOKEN
? JSON Web Token(JWT)是一個非常輕巧的規范。這個規范允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息。 ? 簡稱JWT,在HTTP通信過程中,進行身份認證。 ? 我們知道HTTP通信是無狀態的,因此客戶端的請求到了服務端處理完之后是無法返回給原來的客戶端。因此需要對訪問的客戶端進行識別,常用的做法是通過session機制:客戶端在服務端登陸成功之后,服務端會生成一個sessionID,返回給客戶端,客戶端將sessionID保存到cookie中,再次發起請求的時候,攜帶cookie中的sessionID到服務端,服務端會緩存該session(會話),當客戶端請求到來的時候,服務端就知道是哪個用戶的請求,并將處理的結果返回給客戶端,完成通信。 ? 通過上面的分析,可以知道session存在以下問題: ? 1、session保存在服務端,當客戶訪問量增加時,服務端就需要存儲大量的session會話,對服務器有很大的考驗; ? 2、當服務端為集群時,用戶登陸其中一臺服務器,會將session保存到該服務器的內存中,但是當用戶的訪問到其他服務器時,會無法訪問,通常采用緩存一致性技術來保證可以共享,或者采用第三方緩存來保存session,不方便。
客戶端通過用戶名和密碼登錄服務器;
服務端對客戶端身份進行驗證;
服務端對該用戶生成Token,返回給客戶端;
客戶端發起請求,需要攜帶該Token;
服務端收到請求后,首先驗證Token,之后返回數據。
客戶端將Token保存到本地瀏覽器,一般保存到cookie中。
服務端不需要保存Token,只需要對Token中攜帶的信息進行驗證即可;
無論客戶端訪問后臺的那臺服務器,只要可以通過用戶信息的驗證即可。
JWT 的原理是,服務器認證以后,生成一個 JSON 對象,發回給用戶,就像下面這樣。
{ "姓名": "張三", "角色": "管理員", "到期時間": "2018年10月31日0點0分" }
以后,用戶與服務端通信的時候,都要發回這個 JSON 對象。服務器完全只靠這個對象認定用戶身份。為了防止用戶篡改數據,服務器在生成這個對象的時候,會加上簽名(詳見后文)。
服務器就不保存任何 session 數據了,也就是說,服務器變成無狀態了,從而比較容易實現擴展。
實際的 JWT 大概就像下面這樣。
它是一個很長的字符串,中間用點(.)分隔成三個部分。注意,JWT 內部是沒有換行的,這里只是為了便于展示,將它寫成了幾行。
JWT 的三個部分依次如下。
Header(頭部)
Payload(負載)
Signature(簽名)
寫成一行,就是下面的樣子。
Header 部分是一個 JSON 對象,描述 JWT 的元數據,通常是下面的樣子。
{ "alg": "HS256", "typ": "JWT" }
上面代碼中,alg屬性表示簽名的算法(algorithm),默認是 HMAC SHA256(寫成 HS256);typ屬性表示這個令牌(token)的類型(type),JWT 令牌固定寫為JWT。
最后,將上面的 JSON 對象使用 Base64URL 算法(詳見后文)轉成字符串。
Payload 部分也是一個 JSON 對象,用來存放實際需要傳遞的數據。JWT 規定了7個官方字段,供選用。
iss (issuer):簽發人
exp (expiration time):過期時間
sub (subject):主題
aud (audience):受眾
nbf (Not Before):生效時間
iat (Issued At):簽發時間
jti (JWT ID):編號
除了官方字段,你還可以在這個部分定義私有字段,下面就是一個例子。
{ "sub": "1234567890", "name": "John Doe", "admin": true }
注意,JWT 默認是不加密的,任何人都可以讀到,所以不要把秘密信息放在這個部分。
這個 JSON 對象也要使用 Base64URL 算法轉成字符串。
Signature 部分是對前兩部分的簽名,防止數據篡改。
首先,需要指定一個密鑰(secret)。這個密鑰只有服務器才知道,不能泄露給用戶。然后,使用 Header 里面指定的簽名算法(默認是 HMAC SHA256),按照下面的公式產生簽名。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
算出簽名以后,把 Header、Payload、Signature 三個部分拼成一個字符串,每個部分之間用"點"(.)分隔,就可以返回給用戶。
前面提到,Header 和 Payload 串型化的算法是 Base64URL。這個算法跟 Base64 算法基本類似,但有一些小的不同。
JWT 作為一個令牌(token),有些場合可能會放到 URL(比如 api.example.com/");
JWT實戰推薦看此篇博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/6674.html
摘要:框架具有輕便,開源的優點,所以本譯見構建用戶管理微服務五使用令牌和來實現身份驗證往期譯見系列文章在賬號分享中持續連載,敬請查看在往期譯見系列的文章中,我們已經建立了業務邏輯數據訪問層和前端控制器但是忽略了對身份進行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:部分是對前兩部分的簽名,防止數據篡改。也就是說,一旦簽發了,在到期之前就會始終有效,除非服務器部署額外的邏輯。為了減少盜用,的有效期應該設置得比較短。為了減少盜用,不應該使用協議明碼傳輸,要使用協議傳輸。 JSON Web Token(縮寫 JWT)是目前最流行的跨域認證解決方案,本文介紹它的原理和用法。 showImg(https://www.wangbase.com/blogimg...
摘要:由于是存在客戶端上的,所以瀏覽器加入了一些限制確保不會被惡意使用,同時不會占據太多磁盤空間。簽名是對前兩部分的簽名,防止數據被篡改。的作用最開始的初衷是為了實現授權和身份認證作用的,可以實現無狀態,分布式的應用授權。 前言 無狀態的HTTP協議 很久很久之前, Web基本都是文檔的瀏覽而已。既然是瀏覽, 作為服務器, 不需要記錄在某一段時間里都瀏覽了什么文檔, 每次請求都是一個新的HT...
摘要:登錄認證幾乎是任何一個系統的標配,系統客戶端等,好多都需要注冊登錄授權認證。假設我們開發了一個電商平臺,并集成了微信登錄,以這個場景為例,說一下的工作原理。微信網頁授權是授權碼模式的授權模式。 登錄認證幾乎是任何一個系統的標配,web 系統、APP、PC 客戶端等,好多都需要注冊、登錄、授權認證。 場景說明 以一個電商系統,假設淘寶為例,如果我們想要下單,首先需要注冊一個賬號。擁有了賬...
摘要:一什么是為什么使用是機制的一種替代方案。這種情況下使用就會有更加方便。的數據結構一般為三部分組成頭部一般包含簽名的算法和令牌的屬性負載實際需要傳遞的數據一般不加密,因此不要把重要信息放在里面簽名部分是對前兩部分的簽名,防止數據篡改。 一、什么是JSON Web Token? 1、為什么使用JSON Web Token JSON Web Token是cookie session機制的一種...
閱讀 2993·2021-10-13 09:39
閱讀 2693·2021-09-27 13:34
閱讀 2031·2019-08-30 15:55
閱讀 3259·2019-08-30 15:43
閱讀 3630·2019-08-30 11:16
閱讀 1748·2019-08-26 18:28
閱讀 1282·2019-08-26 13:56
閱讀 913·2019-08-26 13:35