【Python】Cookie 和 Session
前言
最近在學(xué)習(xí) Python 網(wǎng)絡(luò)編程,已經(jīng)實(shí)現(xiàn)了簡(jiǎn)單的服務(wù)器和瀏覽器的信息交互。正在進(jìn)一步學(xué)習(xí) Cookie 和 Session(可能還有 Token),所以寫一篇隨筆來(lái)加深自己的理解。
?
一、Cookie 是什么
Cookie,有時(shí)也用其復(fù)數(shù)形式?Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行 Session 跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過(guò)加密)。【來(lái)源:百度百科】
簡(jiǎn)言之,Cookie 是服務(wù)器和瀏覽器通信的一項(xiàng)內(nèi)容。用于實(shí)現(xiàn)本地的持久化。服務(wù)器可以在返回給瀏覽器的數(shù)據(jù)中加入 Set-Cookie 字段。瀏覽器會(huì)把這個(gè)字段的內(nèi)容保存下來(lái),然后再以后的每次請(qǐng)求中自動(dòng)加入 Cookie。這樣,服務(wù)器在收到請(qǐng)求的時(shí)候,就可以識(shí)別請(qǐng)求發(fā)送方的身份,從而給出一些個(gè)性化的響應(yīng)。
所以 Cookie 就是服務(wù)器給客戶端加的一個(gè)識(shí)別標(biāo)簽,這個(gè)標(biāo)簽保存在客戶端,每次請(qǐng)求數(shù)據(jù)時(shí)會(huì)通過(guò)瀏覽器發(fā)送給服務(wù)器。同時(shí),服務(wù)器上會(huì)保存與這個(gè)標(biāo)簽相關(guān)聯(lián)的其他用戶數(shù)據(jù),比如用戶名。Cookie 有如下屬性:
| 屬性 | 介紹 |
| name | cookie的名字 |
| value | cookie的取值 |
| expires | 過(guò)期時(shí)間,如果這個(gè)屬性不指定的話,就是“session cookie”,也就是這個(gè)session在關(guān)閉瀏覽器后會(huì)被刪除 |
| path | cookie的作用域,子文件夾下的網(wǎng)頁(yè)可以訪問(wèn)父文件夾下的網(wǎng)頁(yè)生成的cookie,但是反過(guò)來(lái)卻不能。例如在/路徑下生成了cookie_a,在/sub路徑下生成了cookie_b,則/路徑下只能讀取cookie_a,而/sub路徑下可以讀取cookie_a和cookie_b。注意,如果不設(shè)置這個(gè)屬性的話,默認(rèn)使用的是當(dāng)前的url的相對(duì)路徑,例如在url http://www.a.com/some/page.php中設(shè)置cookie時(shí)沒(méi)有指定path路徑,則它的path屬性為/some。一般我們?cè)O(shè)置cookie,就是讓網(wǎng)站中所有其他的網(wǎng)頁(yè)都能讀取到的,所以應(yīng)該將其設(shè)置為'/'。 |
| domain | cookie的所屬域名,默認(rèn)是全域名,例如www.somesite.com。當(dāng)然也可以自己指定根域名,即somesite.com,這樣的話如果當(dāng)前網(wǎng)站旗下有子域名網(wǎng)站的話,例如a.somesite.com b.somesite.com之類的子域名,那么在子域名所在網(wǎng)站中也能讀取這個(gè)cookie。 |
| secure | 這個(gè)屬性是針對(duì)https來(lái)說(shuō)的,如果設(shè)定其為true的話,那么只有在請(qǐng)求當(dāng)前網(wǎng)站的https的地址的時(shí)候,才能讀取出來(lái)。 |
| httponly | 這個(gè)屬性設(shè)置js對(duì)于當(dāng)前cookie的讀取權(quán)限,如果為true,則js無(wú)法讀取修改當(dāng)前cookie |
?
?
二、Session 是什么
我的理解(待修正)。
Session 從字面解釋,就是“會(huì)話”,瀏覽器和服務(wù)器建立了一次會(huì)話,那么服務(wù)器怎么知道會(huì)話的對(duì)方是誰(shuí)呢?常見的是通過(guò)用戶名和密碼進(jìn)行驗(yàn)證。但是如果每次訪問(wèn)都需要驗(yàn)證就太麻煩了,所以,在一次驗(yàn)證之后,服務(wù)器在返回的 Cookie 中加入一個(gè)字段,Session_id,通常是一個(gè)隨機(jī)字符串。在服務(wù)器中,通過(guò) Session_id 對(duì)當(dāng)前用戶的若干信息進(jìn)行關(guān)聯(lián)(比如用戶名、出生年月等),這樣服務(wù)器就可以借用 Cookie 中的 Session_id 來(lái)識(shí)別會(huì)話對(duì)象。Session 相對(duì)于 Cookie 技術(shù)的優(yōu)點(diǎn)在于它是加密的,由于 Session_id 是一個(gè)隨機(jī)字符串,所以,無(wú)法在 Cookie 中直接偽造訪問(wèn)者的身份信息。當(dāng)然,如果 Session_id 被截獲,仍然是可以冒充身份進(jìn)行訪問(wèn)的。
?
三、如何實(shí)現(xiàn) Cookie
簡(jiǎn)單的方法就是在請(qǐng)求和響應(yīng)中加入 Cookie 字段。
Cookie 的內(nèi)容保存在瀏覽器端。
Session 的數(shù)據(jù)保存在服務(wù)器端。
?
四、我理解的Token
我理解?Token 的機(jī)制和 Session 一樣,也是服務(wù)器和瀏覽器對(duì)暗號(hào)。
不同的是,Session_id 本身是無(wú)意義字符串,完全依靠保存在服務(wù)器的映射表來(lái)指向用戶的有意義信息;而 Token 本身則攜帶信息(加密的),它可能是已存在服務(wù)器的一類有意義的數(shù)據(jù)。
服務(wù)器拿到 Token,只需要進(jìn)行解密,就可以得到已經(jīng)保存在服務(wù)器的數(shù)據(jù)(比如用戶名),從而驗(yàn)證客戶的身份。在這種情況下,就節(jié)約了服務(wù)器用來(lái)存儲(chǔ) Session_id 的空間。
所以,Cookie 是明文的有意義字符串,很容易被偽造;Session 是一串無(wú)意義的字符串,幾乎不可能被偽造,但是攻擊者也可以通過(guò)截獲 Session_id 來(lái)冒充特定用戶;Token 是加了密的 Cookie,它的安全性取決于加密算法。(它們之間可能存在很多細(xì)節(jié)差異,但是從初學(xué)者的角度,我想先做一些粗淺的分類)
五、待解決的問(wèn)題
Session 是否是永久的??
?
?
參考文獻(xiàn):
https://github.com/alsotang/node-lessons/tree/master/lesson16
https://www.zhihu.com/question/19786827/answer/28752144
https://www.cnblogs.com/moyand/p/9047978.html
轉(zhuǎn)載于:https://www.cnblogs.com/bladeofstalin/p/11222429.html
總結(jié)
以上是生活随笔為你收集整理的【Python】Cookie 和 Session的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python与Golang协程异同
- 下一篇: 2、Linux基础练习题