http中session和cookie的區別和關係
目錄
4、為什麼需要 Cookie 和 Session,他們有什麼關聯?
參考: 90%程式設計師面試時都沒有完全答對Cookie和Session的區別
1、session?
定義:給使用者分發的會話標識(session ID),用於區分使用者。Session 代表著伺服器和客戶端一次會話的過程。Session 物件儲存特定使用者會話所需的屬性及配置資訊。這樣,當使用者在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當客戶端關閉會話,或者 Session 超時失效時會話結束。
特徵:session 也是類似的道理,伺服器要知道當前發請求給自己的是誰。為了做這種區分,伺服器就要給每個客戶端分配不同的“身份標識”,然後客戶端每次向伺服器發請求的時候,都帶上這個“身份標識”,伺服器就知道這個請求來自於誰了。
儲存方式:伺服器使用session把使用者的資訊臨時儲存在了伺服器上,使用者離開網站後session會被銷燬。這種使用者資訊儲存方式相對cookie來說更安全,可是session有一個缺陷:如果web伺服器做了負載均衡,那麼下一個操作請求到了另一臺伺服器的時候session會丟失。
2、cookie?
HTTP Cookie(也叫 Web Cookie或瀏覽器 Cookie)是伺服器傳送到使用者瀏覽器並儲存在本地的一小塊資料,它會在瀏覽器下次向同一伺服器再發起請求時被攜帶併傳送到伺服器上。通常,它用於告知服務端兩個請求是否來自同一瀏覽器,如保持使用者的登入狀態。Cookie 使基於無狀態的 HTTP 協議記錄穩定的狀態資訊成為了可能。
Cookie 主要用於以下三個方面:
- 會話狀態管理(如使用者登入狀態、購物車、遊戲分數或其它需要記錄的資訊)
- 個性化設定(如使用者自定義設定、主題等)
- 瀏覽器行為跟蹤(如跟蹤分析使用者行為等)
3、Cookie 和 Session 有什麼不同?
- 作用範圍不同,Cookie 儲存在客戶端(瀏覽器),Session 儲存在伺服器端。
- 存取方式的不同,Cookie 只能儲存 ASCII,Session 可以存任意資料型別,一般情況下我們可以在 Session 中保持一些常用變數資訊,比如說 UserId 等。
- 有效期不同,Cookie 可設定為長時間保持,比如我們經常使用的預設登入功能,Session 一般失效時間較短,客戶端關閉或者 Session 超時都會失效。
- 隱私策略不同,Cookie 儲存在客戶端,比較容易遭到不法獲取,早期有人將使用者的登入名和密碼儲存在 Cookie 中導致資訊被竊取;Session 儲存在服務端,安全性相對 Cookie 要好一些。
- 儲存大小不同, 單個 Cookie 儲存的資料不能超過 4K,Session 可儲存資料遠高於 Cookie。
4、為什麼需要 Cookie 和 Session,他們有什麼關聯?
使用者第一次請求伺服器的時候,伺服器根據使用者提交的相關資訊,建立建立對應的 Session ,請求返回時將此 Session 的唯一標識資訊 SessionID 返回給瀏覽器,瀏覽器接收到伺服器返回的 SessionID 資訊後,會將此資訊存入到 Cookie 中,同時 Cookie 記錄此 SessionID 屬於哪個域名。
當使用者第二次訪問伺服器的時候,請求會自動判斷此域名下是否存在 Cookie 資訊,如果存在自動將 Cookie 資訊也傳送給服務端,服務端會從 Cookie 中獲取 SessionID,再根據 SessionID 查詢對應的 Session 資訊,如果沒有找到說明使用者沒有登入或者登入失效,如果找到 Session 證明使用者已經登入可執行後面操作。
根據以上流程可知,SessionID 是連線 Cookie 和 Session 的一道橋樑,大部分系統也是根據此原理來驗證使用者登入狀態。
5、如果瀏覽器禁止了cookie怎麼辦?
既然服務端是根據 Cookie 中的資訊判斷使用者是否登入,那麼如果瀏覽器中禁止了 Cookie,如何保障整個機制的正常運轉。
- 第一種方案,每次請求中都攜帶一個 SessionID 的引數,也可以 Post 的方式提交,也可以在請求的地址後面拼接 xxx?SessionID=123456...。
- 第二種方案,Token 機制。Token 機制多用於 App 客戶端和伺服器互動的模式,也可以用於 Web 端做使用者狀態管理。
Token 的意思是“令牌”,是服務端生成的一串字串,作為客戶端進行請求的一個標識。Token 機制和 Cookie 和 Session 的使用機制比較類似。
當使用者第一次登入後,伺服器根據提交的使用者資訊生成一個 Token,響應時將 Token 返回給客戶端,以後客戶端只需帶上這個 Token 前來請求資料即可,無需再次登入驗證。
6、如何考慮分散式 Session 問題?
在網際網路公司為了可以支撐更大的流量,後端往往需要多臺伺服器共同來支撐前端使用者請求,那如果使用者在 A 伺服器登入了,第二次請求跑到服務 B 就會出現登入失效問題。
分散式 Session 一般會有以下幾種解決方案:
- Nginx ip_hash 策略,服務端使用 Nginx 代理,每個請求按訪問 IP 的 hash 分配,這樣來自同一 IP 固定訪問一個後臺伺服器,避免了在伺服器 A 建立 Session,第二次分發到伺服器 B 的現象。
- Session 複製,任何一個伺服器上的 Session 發生改變(增刪改),該節點會把這個 Session 的所有內容序列化,然後廣播給所有其它節點。
- 共享 Session,服務端無狀態話,將使用者的 Session 等資訊使用快取中介軟體來統一管理,保障分發到每一個伺服器的響應結果都一致。
7、如何解決跨域請求?Jsonp 跨域的原理是什麼?
如何解決跨域請求?Jsonp 跨域的原理是什麼?
說起跨域請求,必須要了解瀏覽器的同源策略,同源策略/SOP(Same origin policy)是一種約定,由 Netscape 公司 1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到 XSS、CSFR 等攻擊。所謂同源是指"協議+域名+埠"三者相同,即便兩個不同的域名指向同一個 ip 地址,也非同源。
解決跨域請求的常用方法是:
- 通過代理來避免,比如使用 Nginx 在後端轉發請求,避免了前端出現跨域的問題。
- 通過 Jsonp 跨域
- 其它跨域解決方案
重點談一下 Jsonp 跨域原理。瀏覽器的同源策略把跨域請求都禁止了,但是頁面中的 <script><img><iframe>標籤是例外,不受同源策略限制。Jsonp 就是利用 <script> 標籤跨域特性進行跨域資料訪問。
JSONP 的理念就是,與服務端約定好一個回撥函式名,服務端接收到請求後,將返回一段 Javascript,在這段 Javascript 程式碼中呼叫了約定好的回撥函式,並且將資料作為引數進行傳遞。當網頁接收到這段 Javascript 程式碼後,就會執行這個回撥函式,這時資料已經成功傳輸到客戶端了。
JSONP 的缺點是:它只支援 GET 請求,而不支援 POST 請求等其他型別的 HTTP 請求。
相關文章
- Cookie 和 Session 關係和區別CookieSession
- session和cookie關係SessionCookie
- cookie和session的區別CookieSession
- HTTP協議Cookie和Session有什麼區別HTTP協議CookieSession
- 理解cookie、session、localStorage、sessionStorage的關係與區別CookieSession
- cookie和session的區別(全面總結)CookieSession
- cookie和session的詳解與區別CookieSession
- session 和 cookie 有什麼區別?SessionCookie
- cookie和session 有什麼區別?CookieSession
- Cookie與Session 關係CookieSession
- 關於Session和CookieSessionCookie
- Redis分散式Session和普通的cookie session有什麼區別?Redis分散式SessionCookie
- Tomcat 中的 Session 和 CookieTomcatSessionCookie
- 一文搞懂Session和Cookie的用法及區別SessionCookie
- 【Python入門必看】Python中Cookie和Session的區別與聯絡!PythonCookieSession
- session與cookie的區別SessionCookie
- cookie和session有什麼區別?Python學習!CookieSessionPython
- cookie是什麼?和session有什麼區別?CookieSession
- flask框架中的cookie和sessionFlask框架CookieSession
- Cookie和Session的區別以及設計測試用例CookieSession
- 關於Cookie、session和Web StorageCookieSessionWeb
- cookie 和 sessionCookieSession
- session和cookieSessionCookie
- Cookie和SessionCookieSession
- cookie和session有什麼區別?Python學習分享CookieSessionPython
- cookie,session,sessionStorage,localStotage的區別CookieSession
- WebGL和OpenGL的區別及關係Web
- 前端基礎:Session 和 Cookie 差別前端SessionCookie
- 【Javaweb】Cookie和SessionJavaWebCookieSession
- 第74節:Java中的Cookie和SessionJavaCookieSession
- 對session和cookie的理解SessionCookie
- [20180918]disconnect session和kill session的區別.txtSession
- http和https的區別/get和post的區別HTTP
- cookie與session的區別與聯絡CookieSession
- Session與Cookie的區別與聯絡SessionCookie
- cookie與session的區別以及在Django中的實現CookieSessionDjango
- Session和Cookie機制SessionCookie
- 撩下Cookie和SessionCookieSession