自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

干掉服務(wù)狀態(tài)!從 Session 到 Token

開發(fā) 前端
在講Token之前,先簡單說說什么是 Session 和 Cookie。首先要知道 HTTP 請求是無狀態(tài)的,無狀態(tài)的意思就是:每一次請求都是獨立的;每一次請求不會受到前面請求的影響,也不會影響后面的請求。

[[313202]]

在講Token之前,先簡單說說什么是 Session 和 Cookie。

首先要知道 HTTP 請求是無狀態(tài)的;

無狀態(tài)的意思就是:每一次請求都是獨立的;每一次請求不會受到前面請求的影響,也不會影響后面的請求;

比如我們登錄一個系統(tǒng)的時候,驗證用戶名密碼之后,打開系統(tǒng)各個頁面的時候就不需要再進行登錄操作了,直到我們主動退出登錄或超時退出登錄;為了讓服務(wù)器有“記憶功能”,我們可以用到 Session、Cookie。

01.Cookie

是在客戶端(瀏覽器)保存用戶信息的一種機制;Cookie 由服務(wù)器生成,發(fā)送給瀏覽器,然后瀏覽器把 Cookie 以鍵值對的形式保存在客戶端的某個目錄下面;每種瀏覽器存儲大小會有一些差異,一般不超過 4KB;

當下一次請求的時候,會把 Cookie 發(fā)送給服務(wù)端,服務(wù)端對 Cookie 中的信息解析并驗證身份。

比如你入職一個公司,會給你辦一張工卡,上面有你的姓名、工號、部門等信息,你進入職場的時候,拿著工卡就可以進出。

但是 Cookie 是不可以跨域名使用的;就好像我拿著我們公司的工卡,去你們公司,保安肯定是不會放我進去的。

02.Session

保存在服務(wù)端,可以用于記錄客戶狀態(tài);

比如我們經(jīng)常會用 Session 保存客戶的基本信息、權(quán)限信息等;用戶第一次登錄之后,服務(wù)器就會創(chuàng)建一個 Session ,并將 SessionID 返回給瀏覽器,瀏覽器通常將其寫入到 Cookie 中,這種 Cookie 也叫做 SessionCookie ,瀏覽器再次訪問時,只需要拿著 SessionID 從服務(wù)端查找 Session 就可以了。

另外,這個 SessionID 不一定非要保存到 Cookie 中,只是對于瀏覽器客戶端,大家的默認做法是放在 Cookie 中。

03.Cookie 和 Session

關(guān)于 Cookie 和 Session 的區(qū)別,很多同學會回答:“Cookie 保存在客戶端,Session 保存在服務(wù)器端”,其實這樣的想法并不全面:

Cookie 是一個實際存在的的東西,一個很具體的東西,就是一段數(shù)據(jù),而 Session 是一個抽象概念,或者叫做模式方法,它有很多實現(xiàn)方案;

比如 Tomcat 的實現(xiàn)方法:把狀態(tài)保存在服務(wù)端,然后生成一個 JSESSIONID 放在 Cookie 中;請求過來之后,拿著 JSESSIONID 在服務(wù)器端查詢并驗證狀態(tài)。

 

04.Token

當然,隨著用戶量的增加,保存在服務(wù)端的 Session 也不斷增加,這給服務(wù)端帶來了很大的壓力,并且如果程序是集群或分布式方式部署,同一個用戶第一次請求,訪問到了 A 服務(wù)器,創(chuàng)建了 Session,但是第二次請求卻發(fā)到了 B 服務(wù)器上,但是 B 服務(wù)器上并沒有之前創(chuàng)建的 Session;這就是分布式架構(gòu)中的 Session 共享問題。

針對這個問題,我們可以進行服務(wù)器之間的 Session 同步,或者干脆把 Session 保存到第三方的組件中,例如保存到 Redis 中;但是不管是哪種方案,都讓 Session 變成了項目的負擔。

這時候,服務(wù)端就會想,如果 Session 不保存在我這里多好,第一次發(fā)送用戶名密碼給我,驗證通過后我給你一個通行證,以后客戶端每次請求的時候就帶著這個通行證;

這個通行證就是 token,當然這個驗證結(jié)果中需要包含客戶端信息,服務(wù)端需要知道請求是誰發(fā)過來的;還需要包含時間信息,因為通行證不可能永遠有效;通行證還不能是明文的,否則會有被截獲的風險。

HMAC-SHA1:

  1. token = user_id|expiry_date|HMAC(user_id|expiry_date, k) 

AES:

  1. token = AES(user_id|expiry_date, x) 

RSA:

  1. token = RSA(user_id|expiry_date, private key

 

05.SSO 單點登錄

有些公司會建設(shè)統(tǒng)一登錄系統(tǒng)(單點登錄),客戶端先去這個系統(tǒng)獲取 Token ,驗證通過再拿著這些Token去訪問其他系統(tǒng);API Gateway 也可以提供類似的功能,我們公司就是這樣,客戶端接入的時候,先向網(wǎng)關(guān)獲取 Token,驗證通過了才能訪問被授權(quán)的接口,并且一段時間后要重新或者 Token。

 

06.Token 和 Session

對于 session 和 token ,對比它們沒有本質(zhì)的區(qū)別,兩者都是加密后的字符串,都可以做身份驗證。當然 token 比 session 還是有一定區(qū)別的,比如 token 跨域更容易,token 更好控制等等,另外在授權(quán)場景下,token 比 session 有著更大的優(yōu)勢;

比如,我開發(fā)一個網(wǎng)站,允許微信用戶登錄,使用 token 的流程大概是這樣的:

  • 登錄網(wǎng)站時,跳轉(zhuǎn)到微信登錄頁面;
  • 用戶輸入用戶名密碼登錄微信后,給我們一個 token;
  • 用戶拿著 token 就可以在我們的網(wǎng)站使用,而我們網(wǎng)站并不需要知道你微信的用戶名和密碼。
  • 總之,如果在同一個網(wǎng)站內(nèi),token 和 session 并沒有太大的區(qū)別,如果跨站使用,token 會更方便一些。

Cookie、Session 和 Token 就介紹這么多,如果有問題,大家可以加我微信或進微信群,咱們一起討論。

責任編輯:武曉燕 來源: 會點代碼的大叔
相關(guān)推薦

2017-03-20 08:41:00

2020-01-19 10:07:25

SessionTokenCookie

2019-06-11 14:45:25

2019-11-07 10:37:36

CookieSessionToken

2017-07-05 15:09:52

密碼token瀏覽器

2023-12-11 11:29:35

2023-12-27 08:16:54

Sessiontoken安全性

2015-11-26 10:20:17

F5應(yīng)用交付

2021-08-09 08:53:30

HTTP狀態(tài)化協(xié)議

2021-09-05 18:26:42

2011-03-24 10:59:10

Nagios監(jiān)控mysql

2021-03-23 10:45:23

CookieSession前端

2021-05-19 09:37:45

SessionTokencookie

2014-10-16 14:13:56

華為

2019-10-11 11:20:28

物聯(lián)網(wǎng)技術(shù)機器學習

2021-08-02 12:50:45

sessiontokenJava

2009-07-24 10:41:00

ASP.NET Ses

2009-07-20 17:21:43

Session狀態(tài)ASP.NET

2023-10-04 00:05:00

SessionCookie

2016-08-25 21:12:31

微服務(wù)架構(gòu)發(fā)布
點贊
收藏

51CTO技術(shù)棧公眾號