Java三十七篇:cookie和session
1.cookie 是什么



httpOnly 是限制js,ajax,document.cookie去訪問


注意:set-cookie傳遞的cookie的限制條件,在cookie是不會(huì)攜帶的,是瀏覽器自己處理掉了。


2.使用cookie的限制


3.session 是如何利用cookie機(jī)制實(shí)現(xiàn)用戶登錄驗(yàn)證的

在實(shí)際業(yè)務(wù)中,很多請(qǐng)求需要用戶已登錄狀態(tài)。這個(gè)時(shí)候,用戶首次登錄,服務(wù)器接收用戶的姓名和密碼,然后生成一個(gè)有時(shí)效性的session,然后用set-cookie傳給客戶端,并設(shè)置cookie的時(shí)效等。瀏覽器傳遞給服務(wù)器cookie,服務(wù)器就可以進(jìn)行session比對(duì),正確則返回?cái)?shù)據(jù)。
4.第三方cookie

用戶訪問First-Party網(wǎng)站,然后這個(gè)網(wǎng)站的網(wǎng)頁(yè)引用了Third-Party的某些圖片,那么瀏覽器是可以下載這些圖片的,但是當(dāng)下載這些圖片的時(shí)候,Third-Party通過set-cookie把cookie設(shè)置在了瀏覽器上,這樣當(dāng)瀏覽器直接訪問這個(gè)Third-Party的時(shí)候,就會(huì)自動(dòng)攜帶這個(gè)cookie。這樣Third-Party就知道瀏覽器曾經(jīng)訪問過First-Part的某些網(wǎng)頁(yè),從而搜集用戶的行為。
5.cookie存在的安全問題
1.明文傳輸,存在安全問題
2.大小限制,超過大小可能會(huì)丟失
3.站點(diǎn)之間可能互相訪問cookie,造成安全問題
1.使用Https
2.大小不超過4K
3.同源策略
1.什么是同源策略


2.沒有同源策略會(huì)存在什么問題
1.第一個(gè)問題:只能保證cookie是來自同一個(gè)瀏覽器,不能保證是用戶自愿發(fā)起的。

用戶向一個(gè)站點(diǎn)發(fā)起請(qǐng)求,很多請(qǐng)求可能不是用戶自發(fā)的行為,比如先請(qǐng)求A站點(diǎn),然后A站點(diǎn)返回一個(gè)HTML文件,然后引用B站點(diǎn)的一個(gè)JS文件,于是瀏覽器就向B站點(diǎn)請(qǐng)求一個(gè)JS文件。而這個(gè)行為不是用戶自發(fā)的行為。

這樣的話就相當(dāng)于B站點(diǎn)可以返回站點(diǎn)A了,不用登陸就可以了。
2.站點(diǎn)B可以隨意攻擊站點(diǎn)A。

用戶同時(shí)打開A\B兩個(gè)站點(diǎn)。B站點(diǎn)可以通過JS去攻擊站點(diǎn)A,比如修改用戶的輸入值,造成攻擊等。
4. 同源策略也防止不了的CSRF

總結(jié):
Cookie是客戶端保存用戶信息的一種機(jī)制,存儲(chǔ)在客戶端的文件中。
cookie存在的問題:
1.明文傳輸,存在安全問題
2.大小限制,超過大小可能會(huì)丟失
3.站點(diǎn)之間可能互相訪問cookie,造成安全問題
解決問題方案:
1.使用Https
2.大小不能超過4k
3.同源策略(協(xié)議、主機(jī)、端口號(hào)完全相同)

Cookie 與 Session 的區(qū)別:
Cookie 存在瀏覽器的文件里,Session 存在服務(wù)器的文件里
Session 是基于 Cookie 實(shí)現(xiàn)的,具體做法就是把 SessionID 存在 Cookie 里
共同點(diǎn) :由服務(wù)端統(tǒng)一設(shè)置發(fā)送給客戶端。