tft每日頭條

 > 圖文

 > 登錄用戶中心

登錄用戶中心

圖文 更新时间:2024-09-01 17:24:04

最近和同事一起打羽毛球總是感覺跟不上節奏,我思考再三後得出結論,一定是我的拍子不行,因為我的技術肯定是沒有問題的。

登錄用戶中心(用戶登錄那點事兒)1

OK,知道了原因之後我果斷打開淘寶,搜索尤尼克斯,接着頁面便出現了很多選擇,我選擇了林丹同款,點擊之後跳出了一個登錄頁面。哈,原來我還沒有登陸啊。

登錄用戶中心(用戶登錄那點事兒)2

這簡單,熟練地輸入賬号密碼完成登錄,接着頁面出現了拍子的詳細信息。好的,現在就讓我來看看這塊拍子都有什麼特點……

登錄用戶中心(用戶登錄那點事兒)3

現在讓我們倒退,把畫面定格在登錄頁面,當我的鼠标點擊登錄按鈕後,都發生了什麼。

登錄用戶中心(用戶登錄那點事兒)4

發生的事情是,浏覽器把我輸入的信息發送給了淘寶的服務器,來确定我是否輸入了正确的賬号密碼,如果驗證通過,服務器會發送一個憑證給浏覽器,浏覽器把它存起來,以後每次需要向服務器取數據都要帶上這個憑證,這就像是人的身份證一樣。

好了,下面開始說點實在的。通常服務器返回的那個東西叫做sessionId,浏覽器會把它存在cookie裡,同時服務器上保存了我們的登錄狀态,但是需要sessionId這把鑰匙才能獲取。這樣做的好處是,信息都存在服務器端,服務器可以掌控一切,比如它可以突然讓我們強制退出登錄。但缺點也是顯而易見,服務器端的壓力會增大,因為要使用很多内存來存儲用戶的登錄狀态。于此相對應的,還有一種方法是,把用戶的登錄狀态存儲在浏覽器端,用數字簽名的方式保證數據不被篡改,這時浏覽器存儲的就不是簡單的sessionid了,而是具體的用戶登錄狀态,比如用戶的id。此時,服務器端隻要驗證浏覽器傳過來的憑證是否有效就可以了,它自己則不再存儲用戶的登錄狀态。到這,今天的主角就該出場了,它就是JWT,也就是存在浏覽器中的那個東西,讓我們看看它究竟長啥樣。

PART01

什麼是JWT

JWT是JSON Web Token的簡稱,它是一種互聯網開放标準。它被設計用來在兩方之間傳輸聲明(claims),在我們日常應用中,就是在服務器和客戶端之間傳遞認證信息,也就是我們常說的token。在設計中,它被要求是結構緊湊,URL安全的,所以可以放在URL、請求頭和body中。通常的做法是放在請求頭的Authorization中,這也是很多第三方庫采用的做法。JWT既可以是加密的也可以是不加密的,如果不加密的話,請不要放敏感信息。

PART 02

什麼是JWS

簡單來說,JWT加簽名就變成了JWS(json Web Signature),所以我們通常用的有簽名的JWT其實準确的叫法是JWS。這裡之所以提到JWS,是為了下面所涉及到的概念,通常我們不用深入了解,想要深入了解請參考RFC7515。

PART 03

Payload

JWT的結構概括來說可以分成3部分,中間用(.)連接:

  • Header
  • Payload
  • Signature

所以一個典型的jwt類似xxxxxx.yyyyyy.zzzzzz

Header

JWT的header是一個json對象,通常是下面這個樣子:

{

"typ":"JWT",

"alg":"HS256"

}

typ屬性表示這個令牌的類型,如果是JWT令牌,這個值是JWTalg屬性表示後面會用到的簽名的算法,HS256表示HMAC SHA256。

一般情況下,有這兩個屬性就夠了,但其實還可以有其它屬性。實際上這兩個屬性是定義在JWS的header中的,JWT隻是拿過來用。所以想知道header裡還有哪些屬性,請查看JWS的header屬性,除此之外,payload中的屬性也可以放到header中,特殊情況下有用。最後要把這個json使用base64url加密後,才能放到JWT中,作為JWT的第一部分。

Payload

JWT的payload部分也是一個json對象,JWT規定了7個字段供選用,分别是:

  • iss(Issuer):簽發人
  • exp(Expiration Time):過期時間
  • sub(Subject):主題
  • aud(Audience):受衆
  • nbf(Not Before):生效時間
  • iat(Issued At):簽發時間
  • jti(JWT ID):編号

以上這些屬性都是可選的,除了這些,我們還可以自定義一些屬性。下面是一個padyload的例子:

{

"iss":"http://localhost",

"iat":1661503024,

"exp":1661506624,

"nbf":1661503024,

"jti":"jloZNwoyTlIW3OE2",

"sub":1,

"prv":"23bd5c8949f600adb39e701c400872db7a5976f7"

}

和header一樣,最後用base64url加密後放到JWT的第二部分。

需要注意的是,如果加了簽名,那麼這部分信息确實無法被更改了,但是依然可以被任何人看到,所以敏感信息不要放到paylaod中,加密過的信息除外。

Signature

Signature是對前面2部分的簽名,目的是防止數據被篡改。首先我們需要一個密鑰,這個密鑰放在服務器端,然後使用Header裡指定的算法(通常是HS256),按照下面的規則生成簽名:

HMACSHA256(base64UrlEncode(header) "." base64UrlEncode(payload), secret)

把這個簽名也用base64url加密,然後放到JWT的第三部分,一個完整的JWT就生成了。

PART 04

base64Url

由于JWT有可能被放到url中,所以這裡對Header和Payload的加密不是普通的base64算法,而是在此基礎上做了一些修改。首先依然是用普通的base64算法對字符串加密,然後把加密的字符串中的" "替換成"-","/"替換成"_",最後去掉字符串中的"="。

PART 05

JWT的結構

1. JWT是無狀态的,所以服務器不會保存用戶的登錄信息,這可以減輕服務器端的壓力

2. 用戶先在設備A進行登錄,後又在設備B進行登錄,此時A設備的登錄狀态不會退出。

3. JWT一旦簽發,除非過期或者更換了密鑰,否者一直有效,正因如此,JWT的過期時間最好不要太長。

登錄用戶中心(用戶登錄那點事兒)5

以上,JWT的重點内容都在這裡了,雖然不多但是要理解其中任何一個細節都不是容易的事,如果你覺得我講得還不錯,就給我點個贊吧。最後祝所有看完這篇文章的朋友都能實現自己的理想,事業有成,家庭幸福。

本文所有文字版權均屬“寶略科技”,更多内容請搜索關注【寶略科技】微信公衆号~

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved