HTTP 協議是無狀態的,主要是為了讓 HTTP 協議盡可能簡單,使得它能夠處理大量事務。HTTP/1.1 引入 Cookie 來保存狀態信息。
Cookie 是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器之后向同一服務器再次發起請求時被攜帶上,用于告知服務端兩個請求是否來自同一瀏覽器。由于之后每次請求都會需要攜帶 Cookie 數據,因此會帶來額外的性能開銷(尤其是在移動環境下)
客戶端訪問服務器的流程如下
* 首先,客戶端會發送一個http請求到服務器端。
* 服務器端接受客戶端請求后,建立一個session,并發送一個http響應到客戶端,這個響應頭,其中就包含Set-Cookie頭部。該頭部包含了sessionId。Set-Cookie格式如下
`Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]`
* 在客戶端發起的第二次請求,假如服務器給了set-Cookie,瀏覽器會自動在請求頭中添加cookie
* 服務器接收請求,分解cookie,驗證信息,核對成功后返回response給客戶端
Cookie 曾一度用于客戶端數據的存儲,因為當時并沒有其它合適的存儲辦法而作為唯一的存儲手段,但現在隨著現代瀏覽器開始支持各種各樣的存儲方式,Cookie 漸漸被淘汰。新的瀏覽器 API 已經允許開發者直接將數據存儲到本地,如使用 Web storage API(本地存儲和會話存儲)或 IndexedDB。
#### 用途
* 會話狀態管理(如用戶登錄狀態、購物車、游戲分數或其它需要記錄的信息)
* 個性化設置(如用戶自定義設置、主題等)
* 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)
Cookie技術通過在請求和響應報文中寫入Cookie信息來控制客戶端的狀態;
Cookie會根據從服務器端發送的響應報文內的一個叫做Set-Cookie的首部字段信息,通知客戶端保存Cookie。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入Cookie值后發送出去

#### 分類
* 會話期 Cookie:瀏覽器關閉之后它會被自動刪除,也就是說它僅在會話期內有效。
* 持久性 Cookie:指定過期時間(Expires)或有效期(max-age)之后就成為了持久性的 Cookie
#### 瀏覽器禁用 Cookie
此時無法使用 Cookie 來保存用戶信息,只能使用 Session。除此之外,不能再將 Session ID 存放到 Cookie 中,而是使用 URL 重寫技術,將 Session ID 作為 URL 的參數進行傳遞
【知識點】
* cookie只是實現session的其中一種方案。雖然是最常用的,但并不是唯一的方法。禁用cookie后還有其他方法存儲,比如放在url中
* 現在大多都是Session + Cookie,但是只用session不用cookie,或是只用cookie,不用session在理論上都可以保持會話狀態。可是實際中因為多種原因,一般不會單獨使用
* 用session只需要在客戶端保存一個id,實際上大量數據都是保存在服務端。如果全部用cookie,數據量大的時候客戶端是沒有那么多空間的。
* 如果只用cookie不用session,那么賬戶信息全部保存在客戶端,一旦被劫持,全部信息都會泄露。并且客戶端數據量變大,網絡傳輸的數據量也會變大
- 概述
- 網絡時延
- 進程間通信
- URI
- URL
- URN
- NAT
- 操作系統基礎
- 內核
- 用戶空間
- 網絡協議模型
- 四層網絡協議模型
- 鏈路層
- 以太網協議
- ARP協議
- RARP協議
- MAC地址
- 網絡層
- IP協議
- ICMP協議
- 子網掩碼
- 傳輸層
- TCP協議
- TCP慢啟動
- TCP性能
- UDP協議
- SCTP協議
- 應用層
- DNS
- TCP/IP協議族
- Socket
- Socket通信模型
- socket和TCP/IP協議族
- Socket三次握手四次揮手
- OSI七層模型
- 物理層
- 數據鏈路層
- 網絡層
- 傳輸層
- 應用層
- HTTP
- 基礎
- HTTP/1.0
- HTTP/1.1
- http2.0
- HTTP報文
- WEB瀏覽器工作機制
- HTTP事務時延
- HTTP與HTTPS區別
- 持久連接
- 用戶驗證
- web結構組件
- 代理
- 正向代理
- 反向代理
- 緩存
- 網關
- 隧道-tunnel
- Agent代理
- http協議補充
- Servlet3異步請求
- ajax
- Comet
- WebSocket
- SPDY協議
- HTTP/2
- QUIC
- WebDAV
- http方法
- http連接
- 短連接&長連接
- 管線化
- 網絡會話
- cookie
- session
- token
- jwt
- cookie與session的區別
- Spring Session
- 分布式session實現方案
- 同源策略
- 跨域
- CORS
- HTTP三大安全問題
- JWT vs OAuth
- HTTPS
- SSL&TLS
- OpenSSL
- HTTPS和TLS/SSL的關系
- X509標準和PKI
- IO模型
- IO
- I/O模型
- 傳統阻塞式I/O
- 非阻塞式I/O
- IO復用
- Connection Per Thread模式
- IO多路復用模型流程
- Reactor模式
- 單Reactor單線程
- 單Reactor多線程
- 主從Reactor多線程
- Proactor模型
- Selector模型
- 信號驅動I/O
- 異步I/O
- select/poll/epoll
- select
- poll
- epoll
- select/poll/epoll適用場景
- 零拷貝原理
- 讀取文件發送網絡內存拷貝
- 零拷貝
- Netty零拷貝
- 密碼學
- 密碼學Hash算法分類
- 加密算法
- 對稱加密
- 非對稱加密
- 數字簽名
- RSA數字簽名算法
- DSA數字簽名算法
- 數字證書
- MAC算法
- web安全
- CSRF攻擊
- XSS
- cookie劫持
- SQL注入
- DDos攻擊
- 常見面試題
- 瀏覽器工作機制和原理
- XSS如何預防
- 如何防止cookie被劫持
- 附錄
- HTTP狀態碼
- 常用的網絡端口