Cookie 與 Session 詳(hu)解(che)【拿去面試用】

一、Cookie

  • Cookie 是瀏覽器訪問服務器後,服務器傳給瀏覽器的一段數據
  • 該數據以一個稱爲「Set-Cookie」的 HTTP 報頭格式從 Web 服務器發出。 瀏覽器以稱爲「Cookie」的 HTTP 報頭格式將 Cookie 送回服務器
  • Cookie 在瀏覽器端是以文件形式保存的
  • 此後每次瀏覽器訪問該服務器,都必須帶上這段數據
  • 包含多個字段 '過時時間'、'路徑'、'域名'
  • Cookie 是在客戶端保持狀態的方案,補充 HTTP 無狀態協議的特色

二、Session

  • Session 是在服務端保持狀態的方案
  • 用戶打開瀏覽器訪問網站,服務端生成的sessionID,傳遞到瀏覽器的 Cookie 保存 ,在每次請求時都會自動帶上 sessionID ,而後服務器端根據 sessionID 找到對應的 Session 值

三、HTTP協議

上文有提到 Cookie 與 Session 都產生於用來解決 HTTP 協議的無狀態,無鏈接的特色,那麼到底什麼能夠被稱做「無狀態」呢?
因而咱們能夠簡單整理一下通訊的過程(見下圖),位於應用層如下的TCP/IP協議對數據的層層封裝,使得咱們從一個客戶端到服務端(或者能夠說另外一個客戶端)的數據交換看起來是端到端的,隱藏一層又一層的數據封裝和校驗。
那麼,「無狀態」在這個模型中到底體如今什麼地方呢?粗略的能夠理解爲【C端是一個求愛者,S端是一我的見人愛的女神】,
我從C端給S端發了一句「你喜歡我嗎」,
S端回覆了一句「喜歡呀」,
C端再問「你喜歡我什麼」
S端卻回了一句「我何時喜歡你了」
......
其實我意在說明,「無狀態」即爲無感情,無上下文,是一次匿名的交互,寫這個前看了許多文章中,把「無狀態」歸爲HTTP協議的_缺陷_,可是我以爲更是一種_特色_,從WIKI百科的描述中能夠見到這句話php

High-traffic websites often benefit from web cache servers that deliver content on behalf of upstream servers to improve response time

能夠將其理解爲,HTTP協議爲「高速通訊」帶來了好處,也是歷史選擇了這種機制。可是隨着發展,咱們須要不能再匿名的去交流,咱們須要知道對方是誰,咱們期待下面的對話場景:
C端:「你喜歡我嗎」
S端:「喜歡你啊」
C端:「喜歡我什麼」
S端:「全部」
......
emmmmmm...這多是咱們想要的效果,咱們須要知道對方是誰,知道上下文是什麼,須要維護對方是誰的這個_狀態_。因而 Cookie 和 Session 就出現了,用於在C端和S端來分別維護「我是誰」的狀態。
若是想聽更好的故事,下面的可能更加的奏效web

常去的一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就須要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:
一、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種作法就是協議自己支持狀態。
二、發給顧客一張卡片,上面記錄着消費的數量,通常還有個有效期限。每次消費時,若是顧客出示這張卡片,則這次消費就會與之前或之後的消費相聯繫起來。這種作法就是在客戶端保持狀態。
三、發給顧客一張會員卡,除了卡號以外什麼信息也不紀錄,每次消費時,若是顧客出示該卡片,則店員在店裏的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種作法就是在服務器端保持狀態。

CS.png

四、Cookie 與 Session 的關係

先引用一句WIKI 上在介紹Session時候對Cookie的解釋吧後端

Client-side sessions use cookies and cryptographic techniques to maintain state without storing as much data on the server. When presenting a dynamic web page, the server sends the current state data to the client (web browser) in the form of a cookie. The client saves the cookie in memory or on disk. With each successive request, the client sends the cookie back to the server, and the server uses the data to "remember" the state of the application for that specific client and generate an appropriate response.

我就翻譯第一句話吧. 客戶端session使用cookie和加密技術來保持狀態
能夠很容易的發現,他們的做用大體同樣,存儲位置不一樣,
下面再用一段PHP程序來解釋吧瀏覽器

XK27WKF92XZDOVR2code5T/codeU[U.png

後端代碼:服務器

<?php
session_start();
setcookie('name','tao') ;
setcookie('gender','male') ;
var_dump(session_id());
var_dump($_COOKIE);

第一次訪問;
$_COOKIE並無值cookie

cookie.png

第二次訪問:
$_COOKIE有值了
nocookie.pngsession

因此能夠很明顯的看出,setcookie()對於 $_COOKIE 的影響並非當即生效的.這是由於setcookie()是用來給客戶端發送一個HTTP Cookie 的值, 可是 $_COOKIE 則是來獲取客戶端傳遞的 Cookie 值。因此二者的做用域不同。所以纔會出現這種狀況。app

五、寫在最後

關於 Session 和 Cookie 的理解就到此爲止,我以爲應該設計到更多知識,包括但不限於瀏覽器的運行機制,Cookie 實現機制, Session 持久化,php.ini 對session的影響etc.ide

若是有不對的地方,記得來交互意見 :)網站

相關文章
相關標籤/搜索