http是無狀態(tài)的,一次請求結(jié)束,連接斷開,下次服務器再收到請求,它就不知道這個請求是哪個用戶發(fā)過來的。當然它知道是哪個客戶端地址發(fā)過來的,但是對于我們的應用來說,我們是靠用戶來管理,而不是靠客戶端。所以對我們的應用而言,它是需要有狀態(tài)管理的,以便服務端能夠準確的知道http請求是哪個用戶發(fā)起的,從而判斷他是否有權(quán)限繼續(xù)這個請求。這個過程就是常說的會話管理。它也可以簡單理解為一個用戶從登錄到退出應用的一段期間。本文總結(jié)了3種常見的實現(xiàn)web應用會話管理的方式:

1)基于server端session的管理方式

2)cookie-base的管理方式

3)token-base的管理方式

這些內(nèi)容可以幫助加深對web中用戶登錄機制的理解,對實際項目開發(fā)也有參考價值,歡迎閱讀與指正。

1. 基于server端session的管理

在早期web應用中,通常使用服務端session來管理用戶的會話??焖倭私夥斩藄ession:

1) 服務端session是用戶第一次訪問應用時,服務器就會創(chuàng)建的對象,代表用戶的一次會話過程,可以用來存放數(shù)據(jù)。服務器為每一個session都分配一個唯一的sessionid,以保證每個用戶都有一個不同的session對象。

2)服務器在創(chuàng)建完session后,會把sessionid通過cookie返回給用戶所在的瀏覽器,這樣當用戶第二次及以后向服務器發(fā)送請求的時候,就會通過cookie把sessionid傳回給服務器,以便服務器能夠根據(jù)sessionid找到與該用戶對應的session對象。

3)session通常有失效時間的設定,比如2個小時。當失效時間到,服務器會銷毀之前的session,并創(chuàng)建新的session返回給用戶。但是只要用戶在失效時間內(nèi),有發(fā)送新的請求給服務器,通常服務器都會把他對應的session的失效時間根據(jù)當前的請求時間再延長2個小時。

4)session在一開始并不具備會話管理的作用。它只有在用戶登錄認證成功之后,并且往sesssion對象里面放入了用戶登錄成功的憑證,才能用來管理會話。管理會話的邏輯也很簡單,只要拿到用戶的session對象,看它里面有沒有登錄成功的憑證,就能判斷這個用戶是否已經(jīng)登錄。當用戶主動退出的時候,會把它的session對象里的登錄憑證清掉。所以在用戶登錄前或退出后或者session對象失效時,肯定都是拿不到需要的登錄憑證的。

以上過程可簡單使用流程圖描述如下: 
image

主流的web開發(fā)平臺(java,.net,php)都原生支持這種會話管理的方式,而且開發(fā)起來很簡單,相信大部分后端開發(fā)人員在入門的時候都了解并使用過它。它還有一個比較大的優(yōu)點就是安全性好,因為在瀏覽器端與服務器端保持會話狀態(tài)的媒介始終只是一個sessionid串,只要這個串夠隨機,攻擊者就不能輕易冒充他人的sessionid進行操作;除非通過CSRF或http劫持的方式,才有可能冒充別人進行操作;即使冒充成功,也必須被冒充的用戶session里面包含有效的登錄憑證才行。但是在真正決定用它管理會話之前,也得根據(jù)自己的應用情況考慮