我在作面試官的時候,曾經問過不少朋友這個問題: Cookie 和 Session 有什麼區別呢?大部分的面試者應該均可以說上一兩句,好比:什麼是 Cookie?什麼是 Session?二者的區別等。前端
但若是再往深刻探討的話,就慢慢有一些朋友不太瞭解了,談起原理時就不多有朋友所有回答準確。今天和你們一塊兒深刻聊聊有關 Cookie 和 Session 的話題 。程序員
什麼是 Cookie 和 Session ?初級程序員高頻面試題。面試
什麼是 Cookie後端
HTTP Cookie(也叫 Web Cookie或瀏覽器 Cookie)是服務器發送到用戶瀏覽器並保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶併發送到服務器上。一般,它用於告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登陸狀態。Cookie 使基於無狀態的 HTTP 協議記錄穩定的狀態信息成爲了可能。跨域
Cookie 主要用於如下三個方面:瀏覽器
什麼是 Session緩存
Session 表明着服務器和客戶端一次會話的過程。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當客戶端關閉會話,或者 Session 超時失效時會話結束。安全
Cookie 和 Session 有什麼不一樣?服務器
前兩層樓內容,絕大部分同窗均可以準確回答併發
爲何須要 Cookie 和 Session,他們有什麼關聯?
提及來爲何須要 Cookie ,這就須要從瀏覽器開始提及,咱們都知道瀏覽器是沒有狀態的(HTTP 協議無狀態),這意味着瀏覽器並不知道是張三仍是李四在和服務端打交道。這個時候就須要有一個機制來告訴服務端,本次操做用戶是否登陸,是哪一個用戶在執行的操做,那這套機制的實現就須要 Cookie 和 Session 的配合。
那麼 Cookie 和 Session 是如何配合的呢?我畫了一張圖你們能夠先了解下。
用戶第一次請求服務器的時候,服務器根據用戶提交的相關信息,建立建立對應的 Session ,請求返回時將此 Session 的惟一標識信息 SessionID 返回給瀏覽器,瀏覽器接收到服務器返回的 SessionID 信息後,會將此信息存入到 Cookie 中,同時 Cookie 記錄此 SessionID 屬於哪一個域名。
當用戶第二次訪問服務器的時候,請求會自動判斷此域名下是否存在 Cookie 信息,若是存在自動將 Cookie 信息也發送給服務端,服務端會從 Cookie 中獲取 SessionID,再根據 SessionID 查找對應的 Session 信息,若是沒有找到說明用戶沒有登陸或者登陸失效,若是找到 Session 證實用戶已經登陸可執行後面操做。
根據以上流程可知,SessionID 是鏈接 Cookie 和 Session 的一道橋樑,大部分系統也是根據此原理來驗證用戶登陸狀態。
三層樓的內容,大部分同窗能夠講清楚。
既然服務端是根據 Cookie 中的信息判斷用戶是否登陸,那麼若是瀏覽器中禁止了 Cookie,如何保障整個機制的正常運轉。
第一種方案,每次請求中都攜帶一個 SessionID 的參數,也能夠 Post 的方式提交,也能夠在請求的地址後面拼接 xxx?SessionID=123456...
。
第二種方案,Token 機制。Token 機制多用於 App 客戶端和服務器交互的模式,也能夠用於 Web 端作用戶狀態管理。
Token 的意思是「令牌」,是服務端生成的一串字符串,做爲客戶端進行請求的一個標識。Token 機制和 Cookie 和 Session 的使用機制比較相似。
當用戶第一次登陸後,服務器根據提交的用戶信息生成一個 Token,響應時將 Token 返回給客戶端,之後客戶端只需帶上這個 Token 前來請求數據便可,無需再次登陸驗證。
四層樓的內容,一部分同窗能夠講清楚。
如何考慮分佈式 Session 問題?
在互聯網公司爲了能夠支撐更大的流量,後端每每須要多臺服務器共同來支撐前端用戶請求,那若是用戶在 A 服務器登陸了,第二次請求跑到服務 B 就會出現登陸失效問題。
分佈式 Session 通常會有如下幾種解決方案:
Nginx ip_hash 策略,服務端使用 Nginx 代理,每一個請求按訪問 IP 的 hash 分配,這樣來自同一 IP 固定訪問一個後臺服務器,避免了在服務器 A 建立 Session,第二次分發到服務器 B 的現象。
Session 複製,任何一個服務器上的 Session 發生改變(增刪改),該節點會把這個 Session 的全部內容序列化,而後廣播給全部其它節點。
共享 Session,服務端無狀態話,將用戶的 Session 等信息使用緩存中間件來統一管理,保障分發到每個服務器的響應結果都一致。
建議採用第三種方案。
如何解決跨域請求?Jsonp 跨域的原理是什麼?
提及跨域請求,必需要了解瀏覽器的同源策略,同源策略/SOP(Same origin policy)是一種約定,由 Netscape 公司 1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,若是缺乏了同源策略,瀏覽器很容易受到 XSS、CSFR 等攻擊。所謂同源是指"協議+域名+端口"三者相同,即使兩個不一樣的域名指向同一個 ip 地址,也非同源。
解決跨域請求的經常使用方法是:
重點談一下 Jsonp 跨域原理。瀏覽器的同源策略把跨域請求都禁止了,可是頁面中的 <script><img><iframe>
標籤是例外,不受同源策略限制。Jsonp 就是利用 <script>
標籤跨域特性進行跨域數據訪問。
JSONP 的理念就是,與服務端約定好一個回調函數名,服務端接收到請求後,將返回一段 Javascript,在這段 Javascript 代碼中調用了約定好的回調函數,而且將數據做爲參數進行傳遞。當網頁接收到這段 Javascript 代碼後,就會執行這個回調函數,這時數據已經成功傳輸到客戶端了。
JSONP 的缺點是:它只支持 GET 請求,而不支持 POST 請求等其餘類型的 HTTP 請求。
以上就是有關 Cookie 和 Session 常見的面試點,不知道有多少同窗能夠在面試中準確回答全部問題。