由于 HTTP
協(xié)議是無狀態(tài)的,所以為了能讓服務(wù)器知道用戶當(dāng)前所處的狀態(tài)叼屠,就需要存儲(chǔ)一些信息在當(dāng)前用戶訪問的瀏覽器中瞳腌,并且需要在下次請(qǐng)求時(shí)發(fā)送到服務(wù)器端,而存儲(chǔ)的這些信息就是Cookie
镜雨;Cookie
的意思就是小餅干嫂侍,就是小而甜的意思。
Cookie
的特性
Cookie
是不能跨瀏覽器的冷离,也就說你使用Goole
瀏覽器產(chǎn)生的Cookie
信息吵冒,IE
瀏覽器是訪問不到的
每個(gè)瀏覽器都會(huì)限制存儲(chǔ)Cookie
的個(gè)數(shù),像FireFox
就限制最多有50個(gè)Cookie
西剥,單個(gè)Cookie
文件的大小限制為4KB
由于同源策略的限制( 協(xié)議痹栖,域名,端口相同則為同源 )瞭空,所以Cookie
也有兩個(gè)參數(shù)來設(shè)置Cookie
的作用域:
- Domain:設(shè)置
Cookie
可以被那些域名獲取到 - Path:設(shè)置可以訪問
Cookie
的路徑
瀏覽器提交Cookie
需要滿足如下的兩個(gè)條件:
- 是當(dāng)前域名和或者父域名的
Cookie
- 是當(dāng)前路徑或者父路徑的
Cookie
滿足上面兩個(gè)條件的Cookie
才能被發(fā)送到服務(wù)器端揪阿,下面舉個(gè)例子,來說明下Cookie
的作用域:
Cookie1:[name=value,domain=.wisepass.com,path=/]
Cookie2:[name=value,doamin=www.wisepass.com,path=/order]
Cookie3:[name=value,domain=www.wisepass.com,path=/]
Cookie4:[name=value,doamin=exmaple.wisepass.com,path=/]
上面列出來四個(gè)Cookie
咆畏,下面來看下www.wisepass.com
能獲取到那些Cooki
:
- Cookie1可以獲取到南捂,因?yàn)?
Cookie1
的domain
是當(dāng)前這個(gè)域名的父域,Path 的路徑也一致 - Cookie2獲取不到旧找,雖然他們的域名相同溺健,但是
Cookie2
的Path
是它的子路徑而不是父路徑 - Cookie3可以獲取到,他們的域名和路徑都一致
- Cookie4 獲取不到钮蛛,因?yàn)?code>domain不一致鞭缭,也不是它的父域名
Session
Session
就是會(huì)話的意思,也就是客戶端訪問服務(wù)器之后就會(huì)和服務(wù)器建立一種Session
(會(huì)話的)關(guān)系魏颓,當(dāng)客戶端下次訪問時(shí)就能知道當(dāng)前這個(gè)客戶端是誰了
相較于Cookie
而言岭辣,Session
是存儲(chǔ)在服務(wù)器端的〉楸ィ客戶端首次請(qǐng)求時(shí)沦童,就會(huì)生成一條Session
記錄仑濒,存儲(chǔ)在服務(wù)器端,同時(shí)為這條Session
記錄生成唯一的SessionID
通過SetCookie
返回到客戶端存儲(chǔ)起來偷遗,之后客戶端再次請(qǐng)求時(shí)墩瞳,服務(wù)端通過 Cookie
拿到SessionID
可以判斷客戶端身份了
已經(jīng)有了Cookie
了,那為什么還需要Session
呢鹦肿?是因?yàn)?code>Cookie其實(shí)有很多的限制的矗烛,每種瀏覽器存儲(chǔ)Cookie
都會(huì)有大小限制;Cookie
是存儲(chǔ)在客戶端的所以很容易被篡改箩溃;每次發(fā)送請(qǐng)求時(shí)都會(huì)帶著Cookie
所以一些敏感信息不方便存儲(chǔ)在Cookie
中;還有就是Cookie
有同源限制的問題碌嘀;所以將一些用戶的登錄信息存儲(chǔ)在Session
中比較方便涣旨,安全;
Session-Cookie 認(rèn)證機(jī)制
- 用戶輸入登錄信息
- 服務(wù)器驗(yàn)證登錄信息股冗,如果正確霹陡,則生成 session 信息,并且存儲(chǔ)到 Redis 中
- 服務(wù)端為當(dāng)前的 Session 信息生成一個(gè)唯一的標(biāo)識(shí)
SessionID
止状,然后放入的Response Header
中的SetCookie
中 - 瀏覽器收到響應(yīng)后就會(huì)把
Cookie
存起來烹棉,當(dāng)下次請(qǐng)求時(shí),瀏覽器會(huì)自動(dòng)帶上該Cookie
- 服務(wù)端從
Request Header
解析Cookie
獲取到 SessionID怯疤,然會(huì)通過此SessionID
獲取保存在服務(wù)器端的Session
信息進(jìn)行權(quán)限校驗(yàn) - 當(dāng)然當(dāng)瀏覽器退出登陸時(shí)浆洗,瀏覽器端的
Cookie
和服務(wù)器端的Session
都會(huì)被清除調(diào)
基于 Session - Cookie 認(rèn)證的優(yōu)缺點(diǎn)
session-cookie 認(rèn)證機(jī)制在基本上所有的網(wǎng)頁瀏覽器上都能夠支持,而且實(shí)現(xiàn)方式也很簡(jiǎn)單
- 當(dāng)存在多臺(tái)服務(wù)器時(shí)會(huì)出現(xiàn)
session
同步問題 - 很容易遭受到
Cookie
欺騙和CRFS
攻擊 - 服務(wù)端存儲(chǔ)壓力集峦,當(dāng)很多的
session
存儲(chǔ)到服務(wù)端時(shí)伏社,會(huì)對(duì)服務(wù)器的存儲(chǔ)造成壓力 - 跨域問題,
Cookie
是屬于同源策略限制的條件之一