一文理解Cookie、Session

2022-10-29 12:00:23

一文理解Cookie、Session

1、什麼是對談

使用者開啟瀏覽器,點選多個超連結,存取伺服器的多個web資源,然後關閉瀏覽器,整個過程就稱為一個對談;

HTTP 是無狀態,有對談的

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

2、Cookie

簡單來說:是伺服器傳送到瀏覽器,並儲存在瀏覽器端的一小塊資料。

當用戶使用瀏覽器再去存取伺服器中的 web 資源時,就會帶著各自的資料去。這樣, web 資源處理的就是使用者各自的資料了。

cookie工作流程

範例程式碼:

基於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!!!";
    }
}

啟動專案,瀏覽器存取

cookie屬性項:

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

3、Session

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

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

範例程式碼:

基於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!!!";
    }

啟動專案,瀏覽器存取

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

4、兩者區別

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