此次咱們聊一下Cookie

會話跟蹤技術用來跟蹤用戶的整個會話,會話就是用戶在登陸網站後的一系列動做,經常使用的是Cookie和Session,二者的惟一區別是前者在瀏覽器記錄信息,後者在服務器。今天只是簡單的說下Cookie,知道的就算看個熱鬧,不知道的但願能幫到你。

以上圖片是我抓包得來,從上面的圖片能夠看出,cookie中的值是key-value格式的,並且是經過一個分號和空格來間隔的。

cookie的流程是:服務器設置cookie---經過response將cookie傳到前端保存在瀏覽器中---前端訪問後端接口時在request header中自動添加上cookie---服務端接收到cookie作一些業務操做。前端

那麼cookie是怎麼工做的呢?首先cookie對於瀏覽器來講只是一個純文本,瀏覽器的安裝目錄下是會有一個專門的文件夾用來保存各個網站的cookie。當從前端發送請求到後端的時候,瀏覽器會自動的檢測下是否有cookie,若是有就會添加到請求的頭信息中,以上是瀏覽器自動幫咱們作的。後端

存儲到cookie中的數據,瀏覽器會自動的放在http請求中,只有是每次請求都必需要發送給服務器的數據纔會放到cookie,好比身份驗證信息。若是是沒必要要的,必然會增長網絡開銷。針對這個存儲信息大小,cookie仍是作了一些限制的。每一個域名下的cookie 的大小最大爲4KB,每一個域名下的cookie數量最多爲20個(但不少瀏覽器廠商在具體實現時支持大於20個)。瀏覽器

cookie的屬性包括:過時時間;域名、路徑等等,這些能夠本身設置,若是不手動設置就會使用cookie的默認設置。安全

expiresbash

過時時間,expires必須是 GMT 格式的時間(能夠經過new Date().toGMTString()或者 new Date().toUTCString() 來得到)。服務器

若是沒有設置的話,那麼默認的有效期就是session,就是會話cookie,這種會在瀏覽器關掉的時候就沒有了。cookie

domain和path網絡

domain是域名,path是路徑,二者組合起來就構成了 URL,domain和path一塊兒來限制 cookie 能被哪些 URL 訪問。session

就是說在訪問這個域名或者是該域名的子域名下,目錄是在該目錄或者是在該目錄下的子目錄下的時候,瀏覽器會自動把cookie放到請求頭部中。dom

若是沒有設置這兩個選項,則會使用默認值。domain的默認值爲設置該cookie的網頁所在的域名,path默認值爲設置該cookie的網頁所在的目錄。

兩點須要注意:domain能夠設置爲頁面自己的域名,或者是該域名的父域名,好比說,www.sougou.com,但是設置爲www.sougou.com,也能夠設置爲sougou.com。

secure

secure選項用來設置cookie只在確保安全的請求中才會發送。當請求是HTTPS或者其餘安全協議時,包含 secure 選項的 cookie才能被髮送至服務器。

默認狀況下,cookie不會帶secure選項(即爲空)。因此默認狀況下,不論是HTTPS協議仍是HTTP協議的請求,cookie 都會被髮送至服務端。但要注意一點,secure選項只是限定了在安全狀況下才能夠傳輸給服務端,但並不表明你不能看到這個 cookie。

httpOnly

這個選項用來設置cookie是否能經過 js 去訪問。默認狀況下,cookie不會帶httpOnly選項(即爲空),因此默認狀況下,客戶端是能夠經過js代碼去訪問(包括讀取、修改、刪除等)這個cookie的。當cookie帶httpOnly選項時,客戶端則沒法經過js代碼去訪問操做(包括讀取、修改、刪除等)這個cookie。

在客戶端是不能經過js代碼去設置一個httpOnly類型的cookie的,這種類型的cookie只能經過服務端來設置。

關於限制客戶端去訪問cookie的問題,這樣作的目的就是爲了保證安全。

試想:若是任何 cookie 都能被客戶端經過document.cookie獲取會發生什麼。當咱們的網頁遭受了 XSS 攻擊,有一段惡意的script腳本插到了網頁中。這段script腳本作的事情是:經過document.cookie讀取了用戶身份驗證相關的 cookie,並將這些 cookie 發送到了攻擊者的服務器。攻擊者垂手可得就拿到了用戶身份驗證信息,因而就能夠利用此用戶信息訪問目標服務器(由於攻擊者有合法的用戶身份驗證信息,因此會經過你服務器的驗證)。

下面的這段是從項目中找到的一段關於設置cookie的代碼:

public void addCookie(HttpServletResponse response, String cookieValue) {
       if (this.cookieDomain == null) {
           throw new IllegalArgumentException("cookies domain is not null");
       } else {
           Cookie cookie = new Cookie(this.coookieName, cookieValue);
           cookie.setPath(this.cookiePath);
           if (this.cookieDomain != null) {
               cookie.setDomain(this.cookieDomain);
           }

           if (this.cookieMaxAge != null) {
               cookie.setMaxAge(this.cookieMaxAge);
           }

           if (this.cookieSecure) {
               cookie.setSecure(true);
           }

           if (this.cookieHttpOnly) {
               cookie.setHttpOnly(true);
           }

           response.addCookie(cookie);
       }
   }
複製代碼

何時 cookie 會被覆蓋:cookie中的name、domain、path 這3個字段數值都相同的時候。

若是顯式設置了 domain,則設置成什麼,瀏覽器就存成什麼;但若是沒有顯式設置,則瀏覽器會自動取 url 的 host 做爲 domain 值;

修改 cookie。

要想修改一個cookie,只須要從新賦值就行,舊的值會被新的值覆蓋。但要注意一點,在設置新cookie時,path、domain這兩個字段必定要和以前保持同樣。不然是不會肯定爲以前的cookie,而是添加了一個新的cookie。

刪除 cookie

刪除一個cookie 也是同樣的,也是從新賦值,只要將這個新cookie的expires選項設置爲一個過去的時間點或者是直接賦值爲0就好了。但一樣要注意,path和domain一樣須要和以前的cookie保持一致。

在開發的過程當中,用戶的登陸態是大部分是放到cookie裏,由於cookie本身有着完整的一套配置,包括上文講到的各類屬性和安全問題,整體來講仍是比較方便的。

東西很少,也很簡單,但願每一個讀者都能徹底消化。

這樣的分享會一直持續,你的關注、轉發和好看是對我最大的支持,感謝。

關注公衆號,最新文章會第一時間出如今那裏哦!

相關文章
相關標籤/搜索