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

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

2)cookie-base的管理方式

3)token-base的管理方式

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

1. 基于server端session的管理

在早期web應(yīng)用中,通常使用服務(wù)端session來管理用戶的會(huì)話??焖倭私夥?wù)端session:

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

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

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

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

以上過程可簡(jiǎn)單使用流程圖描述如下: 
image

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

網(wǎng)友評(píng)論