[TOC]javascript
對於一個web開發者來講,瞭解基本的http協議是必不可少的,只有基礎扎的牢,才能在使用的時候遊刃有餘。html
對於學習我一直都是抱着刨根問底的態度,有人說學習一個東西很簡單,有人說學習一個東西很難,剛好我屬於後者,在個人大腦裏面,學習與使用是兩個不一樣的層次,學習應該是包涵使用的。
(文章開頭就說這麼廢話)java
這篇文章的主題是cookies,下面我來談談個人對cookies的認識。
cookies是http協議的一部分,它主要用來存儲一些不多的數據,這些數據能夠往來於客戶端與服務器之間。
爲何會有cookies這種東西存在,這要從http的特性談起,起初http是一個無狀態的協議(固然如今也是無狀態的協議),之因此無狀態是由於http是基於tcp的上傳應用協議,它的一個主要特色就是用完即放,也就是客戶端發起請求、服務器相應後tcp鏈接就斷開了,這種模式決定了是http沒法保存狀態。 協議自己就是一種約定,爲相同的場景約定出來一套規範,爲將來可能的場景預測出來一套規範。 那麼有了cookies後http就變得有狀態了,能夠說cookies是對http的擴展或者加強,比較經常使用的好比:保存用戶的登錄狀態。雖然是對http的一種加強,可是也引入了一些安全問題,後面會談到具體的安全隱患。 cookies是一種古老的技術,算然如今的瀏覽器提供了其它本地存儲技術,但仍是不能徹底替代cookies,由於cookies是一種能夠被服務器端控制的客戶端存儲技術,而無需咱們用javascript寫額外的存儲代碼。
cookies中定義了幾個關鍵屬性來保證cookies的正常工做。
Expires、Max-Age:web
Domain、Path:瀏覽器
Domain用來指定該cookie能夠被哪一個主機訪問,若設置了該值一般包含其子域名;默認爲當前文檔的主機,不包含子域名。安全
Path:設置可被主機下的哪些路徑訪問,例如/docs與/docs/會匹配不一樣的路徑,前者包含子路勁,後者僅爲當前路徑服務器
SameSite:cookie
Secure、HttpOnly:asp.net
http中引入cookies雖然解決了狀態的問題,但也引入了新的安全問題,如何才能保證cookies不被竊取。在我看來http是無安全可言的,咱們能作的不多,咱們努力盡可能防止客戶端被攻破,但也只僅僅是稍微增長了一點破解難度而已。
下面列舉兩個常常遇到的安全問題:xss
xss攻擊
跨站腳本攻擊,經過設置HttpOnly來阻止客戶端獲取cookies
csrf
跨站請求僞造,被攻擊的網站對於敏感的操做增長確認步驟。
//若是用戶剛好登錄example.com,此時若是在同一瀏覽器的其它站點無心中有如下圖片代碼,則就會被攻擊。 <img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">