cookie屬性有哪些(cookie有哪些屬性)
大家好,我是前端西瓜哥。今天來學習一下 Cookie 的屬性有哪些?以及有什麼作用?
Cookies 是瀏覽器本地儲存資料的一種方案,且會在每次請求中帶上該欄位。
cookie 最常見的用法是作為使用者登入憑證,賦予原本沒有狀態的 HTTP 協議以一種狀態,讓識別一個請求是哪一個使用者發出成為可能。
HTTP 響應報文通過 Set-Cookie 頭欄位給瀏覽器給當前網站設定 cookie:
HTTP/1.1 200 OKSet-Cookie: lang=en-US; Path=/Set-Cookie: token=abcd; Max-Age=6000; Path=/; Expires=Thu, 28 Apr 2022 16:31:36 GMT; HttpOnly
當然也可以在瀏覽器用 JS 指令碼通過 document.cookie 或 CookieStore 來設定 cookie。
瀏覽器拿到 cookie 後,會將它們儲存下來,在下一次請求時將這些 cookie 全放到 Cookie 請求頭中,並用分號分隔:
GET / HTTP/1.1Cookie: lang=en-US; token=abcd
需要特別注意的是,Cookie 的作用域是和 domain(域名或 ip)繫結的,埠無關。
你問我怎麼知道的?因為我本地開發時用 localhost 加上各種埠,結果任意一個埠的請求都會將其他所有埠的 cookie 給我帶上,真的是離譜。
那麼和協議(http: 以及 https:)有關嗎?答案是:以前是和協議無關的,但近幾年標準發生了改變,不同瀏覽器支援程度不同,可以看看下面這篇文章:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite#browser_compatibility
下面我們看看 cookie 的一些屬性。
cookieName=cookieValue
Set-Cookie: token=abcd
設定 cookie 的名字和值,必填項。
HttpOnly
Set-Cookie: token=abcd; HttpOnly
設定後,只能通過 HTTP 響應報文的 Set-Cookie 來新增或更新 cookie ,客戶端無法通過指令碼的方式來讀寫 cookie。
對於敏感資訊比如使用者憑證,請一定要加上 HttpOnly。如果攻擊者成功地實施了 XSS 攻擊,會因為無法讀取 cookie 而拿不到敏感資訊。
Expires
Set-Cookie: token=abcd; Expires=Fri, 29 Apr 2022 05:29:01 GMT
cookie 的過期時間點,使用了 GMT 時間格式的字串。
值必須符合下面格式:
,::GMT
Max-Age
Set-Cookie: token=abcd; Max-Age=6000
cookie 的有效時間長度,單位為秒。通過設定小於等於 0 的數字,可以讓一個 cookie 失效。
如果 Max-Age 和 Expires 同時存在,以 Max-Age 為準。
如果 Expires 和 Max-Age 都沒設定,cookie 的有效期就會設定為 session, 一種臨時會話狀態,會在瀏覽器關閉時銷燬。不過也不總是這樣,這個得看瀏覽器實現,總之不會儲存太久就是了。
Path
Set-Cookie: lang=en-US; Path=/user
設定 cookie 的路徑作用域。
怎麼理解?
我們以上面示例為例,瀏覽器會將名為 lang 的 cookie 儲存到當前域名下。但之後請求時,會判斷路徑是否匹配 /user,來決定是否帶上 cookie。
- / :不會帶上名為 lang 的 cookie
- /user:會帶上
- /user/1:會帶上
- /user2:不會帶上
另外,需要注意的是,可能會有 Path 不同的複數個同名 cookie。
如果請求路徑都匹配上了,不同 Path 下的多個同名 cookie 都會被髮送:
GET /user HTTP/1.1Cookie: lang=user-dir; lang=root
理論上,如果 Set-Cookie 沒有指定 Path,就會被設定為當前請求的路徑。不過實際用 Chrome 測試時,我發現都被設定為 / 了,看來瀏覽器也只是選擇性遵守 HTTP 協議?
不過實際開發時我們都是直接使用 Path=/,簡單粗暴覆蓋所有路徑,沒有必要分路徑,讓事情變得複雜。上面的知識點,大家簡單瞭解就好。
Domain
Set-Cookie: lang=en-US; Domain=.a.com
設定 cookie 的 domain 作用域。
在不提供該屬性的情況下,會使用請求時的 domian,比如
http://www.a.com/api/v1/books 不設定 Domain 時,拿到的 cookie 的 Domain 屬性會被設定為 www.a.com 。
通常我們會省略掉 Domain 屬性。
但在希望多個子域名共享 cookie 的場景下,比如 sub1.a.com 和 sub2.a.com(或者再加上父域名 a.com),就需要顯式將其設定為 .a.com。開頭的小圓點可寫可不寫,都一樣。
如果 Domain 不能覆蓋當前域名,該 cookie 會被認定為無效,然後被丟棄掉。
Secure
Set-Cookie: token=en-US; Secure
該屬性沒有值,屬性本身存在就代表設定為安全模式。
即請求必須為安全連線(HTTPS),cookie 才會被儲存下來。HTTP 協議下,cookie 無效。
SameSite
Set-Cookie: token=abcd; SameSite=Strict
cookie 在跨域時是否應該被髮送。
- Strict:跨域請求嚴禁攜帶本站 cookie。
- Lax:預設值。可通過頂級導航的方式並使用 GET 請求發時可以攜帶(目前我沒有通過 demo 實現該效果,或者我們可以將其無限接近於 Strict)。在 Chrome 80 版本之後,Cookie 的 SameSite 由原來的 None 改為了 Lax。
- None:會攜帶 cookie。但前提是 Secure 設定為 true,即只能在 HTTPS 協議下使用(之前的標準沒有這個要求)。
結尾
以上就是 Cookie 可以設定的所有屬性,學廢了嗎?反正我是麻了。
我是前端西瓜哥,歡迎關注我,學習前端不迷路。