一文理解Cookie、Session

一文理解Cookie、Session

1、什麼是會話

用戶打開瀏覽器,點擊多個超鏈接,訪問伺服器的多個web資源,然後關閉瀏覽器,整個過程就稱為一個會話;

HTTP 是無狀態,有會話的

HTTP 是無狀態的:在同一個連接中,兩個執行成功的請求之間是沒有關係的。這就帶來了一個問題,用戶沒有辦法在同一個網站中進行連續的交互,比如在一個電商網站里,用戶把某個商品加入到購物車,切換一個頁面後再次添加了商品,這兩次添加商品的請求之間沒有關聯,瀏覽器無法知道用戶最終選擇了哪些商品。而使用 HTTP 的頭部擴展,HTTP Cookies 就可以解決這個問題。把 Cookies 添加到頭部中,創建一個會話讓每次請求都能共享相同的上下文資訊,達成相同的狀態。

2、Cookie

簡單來說:是伺服器發送到瀏覽器,並保存在瀏覽器端的一小塊數據。

當用戶使用瀏覽器再去訪問伺服器中的 web 資源時,就會帶著各自的數據去。這樣, web 資源處理的就是用戶各自的數據了。

cookie工作流程

image-20221028232946301

示例程式碼:

基於SpringBoot構建測試環境:

@RestController
@RequestMapping("/alpha")
@Slf4j
public class AlphaController {
    /**
     * cookie示例
     */
    @RequestMapping("/cookie/set")
    public String setCookie(HttpServletResponse response) {
        // 創建實例
        Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
        // 過期時間
        cookie.setMaxAge(60 * 10);
        // cookie的生效範圍 也就是在訪問什麼資源的情況下需要攜帶此cookie
        cookie.setPath("/community/alpha");
        response.addCookie(cookie);
        return "set cookie ok!!!";
    }

    /**
     * 獲取cookie
     */
    @GetMapping("/cookie/get")
    public String getCookie(@CookieValue("code") String code) {
        log.warn("【獲取cookie】 code = {} ", code);
        return "get cookie ok!!!";
    }
}

啟動項目,瀏覽器訪問

image-20221028232033810

cookie屬性項:

屬性項 屬性項介紹
NAME=VALUE 鍵值對,可以設置要保存的 Key/Value,注意這裡的 NAME 不能和其他屬性項的名字一樣
Path 當訪問哪個路徑時,攜帶此token
Expires 過期時間,在設置的某個時間點後該 Cookie 就會失效
Domain 生成該 Cookie 的域名,如 domain=”www.baidu.com
Secure 如果設置了這個屬性,那麼只會在 SSH 連接時才會回傳該 Cookie

3、Session

session,存儲在我們的服務端,下圖是session工作流程圖。

  • 也就是說,伺服器只返回對應的sessionId給瀏覽器

image-20221028232935524

示例程式碼:

基於SpringBoot構建測試環境

 /**
     * session示例
     */
    @RequestMapping("/session/set")
    public String setCookie(HttpSession session) {
        session.setAttribute("code", "0000");
        return "set cookie ok!!!";
    }

    /**
     * 獲取session
     */
    @GetMapping("/session/get")
    public String getCookie(HttpSession session) {
        log.warn("【獲取cookie】 code = {} ", session.getAttribute("code"));
        return "get cookie ok!!!";
    }

啟動項目,瀏覽器訪問

image-20221028233446385

可以看到,伺服器只返回sessionID

4、兩者區別

  1. cookie數據存放在客戶的瀏覽器(客戶端)上,session數據放在伺服器上,但是服務端的session的實現對客戶端的cookie有依賴關係的;
  2. cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session;
  3. session會在一定時間內保存在伺服器上。當訪問增多,會比較佔用你伺服器的性能。考慮到減輕伺服器性能方面,應當使用COOKIE;
  4. 單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能超過3K;