網絡安全基礎之深入理解Cookie


深入理解Cookie

1.什么是cookie,cookie的作用
2.cookie的工作機制,即cookie是運作流程
3.cookie的基本屬性(4個)以及我們如何使用cookie

什么是cookie

HTTP協議本身是無狀態的。什么是無狀態呢,即服務器無法判斷用戶身份。Cookie實際上是一小段的文本信息(key-value格式)。客戶端向服務器發起請求,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。

打個比方,我們去銀行辦理儲蓄業務,第一次給你辦了張銀行卡,里面存放了身份證、密碼、手機等個人信息。當你下次再來這個銀行時,銀行機器能識別你的卡,從而能夠直接辦理業務。

cookie機制

當用戶第一次訪問並登陸一個網站的時候,cookie的設置以及發送會經歷以下4個步驟:

客戶端發送一個請求到服務器 --》 服務器發送一個HttpResponse響應到客戶端,其中包含Set-Cookie的頭部 --》 客戶端保存cookie,之后向服務器發送請求時,HttpRequest請求中會包含一個Cookie的頭部 --》服務器返回響應數據
image

在doGet方法中,new了一個Cookie對象並將其加入到了HttpResponse對象中
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // 設置生命周期為MAX_VALUE
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);
    }

瀏覽器輸入地址進行訪問,結果如圖所示:

image

可見Response Headers中包含Set-Cookie頭部,而Request Headers中包含了Cookie頭部。name和value正是上述設置的。

3. cookie屬性項

屬性項 屬性項介紹
NAME=VALUE 鍵值對,可以設置要保存的 Key/Value,注意這里的 NAME 不能和其他屬性項的名字一樣

Expires

該屬性用來設置Cookie的有效期。Cookie中的maxAge用來表示該屬性,單位為秒。Cookie中通過getMaxAge()和setMaxAge(int maxAge)來讀寫該屬性。maxAge有3種值,分別為正數,負數和0。

如果maxAge屬性為正數,則表示該Cookie會在maxAge秒之后自動失效。瀏覽器會將maxAge為正數的Cookie持久化,即寫到對應的Cookie文件中(每個瀏覽器存儲的位置不一致)。無論客戶關閉了瀏覽器還是電腦,只要還在maxAge秒之前,登錄網站時該Cookie仍然有效。下面代碼中的Cookie信息將永遠有效。

    Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
    // 設置生命周期為MAX_VALUE,永久有效
    cookie.setMaxAge(Integer.MAX_VALUE);
    resp.addCookie(cookie);

當maxAge屬性為負數,則表示該Cookie只是一個臨時Cookie,不會被持久化,僅在本瀏覽器窗口或者本窗口打開的子窗口中有效,關閉瀏覽器后該Cookie立即失效。

    Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
    // MaxAge為負數,是一個臨時Cookie,不會持久化
    cookie.setMaxAge(-1);
    resp.addCookie(cookie);

可以看到,當MaxAge為-1時,時間已經過期

max-age

max-age 可以為正數、負數、0。如果 max-age 屬性為正數時,瀏覽器會將其持久化,當 max-age 屬性為負數,則表示該 Cookie 只是一個會話性 Cookie。當 max-age 為 0 時,則會立即刪除這個 Cookie。Expires 和 max-age 都存在的條件下,max-age 優先級更高。

Cookie的域名

Cookie是不可以跨域名的,隱私安全機制禁止網站非法獲取其他網站的Cookie。

正常情況下,同一個一級域名下的兩個二級域名也不能交互使用Cookie,比如test1.mcrwayfun.com和test2.mcrwayfun.com,因為二者的域名不完全相同。如果想要mcrwayfun.com名下的二級域名都可以使用該Cookie,需要設置Cookie的domain參數為.mcrwayfun.com,這樣使用test1.mcrwayfun.com和test2.mcrwayfun.com就能訪問同一個cookie

一級域名又稱為頂級域名,一般由字符串+后綴組成。熟悉的一級域名有baidu.com,qq.com。com,cn,net等均是常見的后綴。
二級域名是在一級域名下衍生的,比如有個一級域名為mcrfun.com,則blog.mcrfun.com和www.mcrfun.com均是其衍生出來的二級域名。

Cookie的路徑

path屬性決定允許訪問Cookie的路徑。比如,設置為"/"表示允許所有路徑都可以使用Cookie
本文只是筆記用途 轉載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM