天天看點

HTTP系列之:HTTP中的cookies

簡介

cookies的作用

建立cookies

cookies的生存時間

cookies的權限控制

第三方cookies

總結

如果小夥伴最近有通路國外的一些标準網站的話,可能經常會彈出一個對話框,說是本網站為了更好的體驗和跟蹤,需要通路你的cookies,問你同意不同意,對于這種比較文明的做法,我一般是點同意的。

但是轉頭一想,為什麼通路國内的網站從來沒有彈出過這個提示呢?這是一個值得深思的問題,或許當你看完這篇文章之後,就有了答案。

那麼cookies有什麼作用呢?HTTP cookies就是伺服器端發送給浏覽器端的一小部分資料,浏覽器接收到這個資料之後,可以存起來自己用,也可以在後續發送到server端進行一些資料的校驗。

通過在cookies中存儲一些有用的資料,可以将無狀态的HTTP協定變成有狀态的session連接配接,或者用來儲存登入的權限,下次不用密碼即可登陸,非常有用。

一般來說,cookies用在三個方面:

session的管理,用來儲存登入狀态,進而讓HTTP請求可以帶上狀态資訊。

使用者自定義的設定,這些使用者特殊的字段,需要儲存在cookies中。

跟蹤使用者的行為資訊。

在很久很久以前,還沒有現代浏覽器的時候,用戶端的唯一存儲就是cookies,是以cookies也作為用戶端存儲來使用的,但是有了現代的浏覽器之後,一般是建議把用戶端存儲的資料放到其他存儲方式中。

為什麼呢?

因為每次請求cookies中的資料會自動帶上,并且發送到server端,是以如果cookies中存儲了太多的資料,就會導緻伺服器性能的下降。

因為cookies是用戶端的本地存儲,是以如果伺服器端想要設定用戶端的cookies時,通過在響應頭中設定Set-Cookie,浏覽器接收到這個響應頭之後,就會将對應的cookies内容存儲到浏覽器本地。

然後在後續的伺服器請求中都會帶上Cookie header。同時cookie還可以帶上過期時間、發送限制等屬性。

先來看下Set-Cookie的格式:

舉個例子,下面是一個server端的響應:

當浏覽器接收到這個響應之後,就會在本地的cookies中設定對應的值,并且在後續的請求中将這些值以cookies的header形式帶上:

在netty中提供了一個Cookie的類,專門用來表示cookies,這個類中提供了cookies的基本屬性,然後通過使用:

來對響應頭進行設定。

HTTP的cookies有兩種,一種是session cookies,這種cookies會在session結束之後自行删除。

還有一種cookies通過指定Expires或者 Max-Age 來設定過期時間:

其中Expires是HTTP1.0中定義的header,Max-Age是HTTP1.1中定義的header。

HTTP提供了兩個屬性來對cookies的權限進行控制,分别是Secure和HttpOnly。

如果cookies中帶有Secure屬性,那麼cookies隻會在使用HTTPS協定的時候發送給伺服器。如果使用的是HTTP協定,則不會發送cookies資訊。

并且,如果是在http的情況下,server端是不允許給cookie設定Secure屬性的。

但是設定了Secure屬性并不意味着cookies就是安全的,因為可以從其他的手段拿到浏覽器端的cookies。

還有一個屬性是HttpOnly,如果cookies設定了HttpOnly,那麼cookies是不允許被JavaScript通路的,通過設定HttpOnly,我們可以提升用戶端資料的安全性:

cookies還可以添加Domain和Path屬性,用于标記cookies可以發送到的URL。

其中Domain表示域名,而Path表示路徑。

如果Domain沒有設定,則預設是設定cookies的host,這個host是不包含子domain的。如果手動指定了Domain,那麼子domain是會包含在内的。

比如如果我們設定了Domain=flydean.com,那麼子domain:doc.flydean.com也會共享這個cookies。

Path用來比對URL的路徑,隻有比對到的URL才可以發送cookies。

另外HTTP還提供了一個SameSite屬性,表示如果是在CORS環境情況下,是否發送cookies到第三方網站,這樣可以在一定程度上保護網站的資訊。

SameSite有三個可能的值,分别是Strict, Lax, 和 None。如果在Strict情況下,那麼cookie僅發送到與建立它的站點相同的站點。Lax跟Strict類似,不同之處在于當使用者導航到cookie的原始站點時發送cookie,比如通過通路外部站點的連結。 None可以在原始網站和跨站資源通路中使用,但是必須要在安全的環境中進行(設定Secure屬性)。如果沒有設定SameSite,那麼表現是和Lax一緻的。

例如:

我們知道cookies是和domain相關的,如果cookies的domain是和目前通路的頁面相同的話,這個cookies就叫做 first-party cookies。如果和目前的通路頁面不同,比如通路第三方的圖檔、腳本、css等,第三方的伺服器有可能會發送他們自己的cookies,這種cookies叫做第三方cookies,第三方cookies主要被用來廣告或者跟蹤使用者的行為資訊。

對于有些浏覽器來說,可能會禁用第三方的cookies,這有可能會導緻通路網站的一些功能問題,大家可以主要觀察一下。

繼續閱讀