為什麼需要 cookie 和 session

2022-05-05 08:45:13 字數 1481 閱讀 5350

在web發展史中,我們知道瀏覽器與伺服器間採用的是 http 協議,而這種協議是無狀態

我們在開啟乙個網頁 a 後,再開啟乙個網頁 b ,這個時候網頁 b 知不知道我們是開啟網頁 a 的人呢?答案是不知道,這就是無狀態。

據說這麼設計是為了保證伺服器不會因為儲存當前的傳輸資訊而**(畢竟當時電腦的效能很低),並且當時都是靜態網頁,不需要儲存使用者登入,也就沒有必要設計成有狀態的了。

但是不久之後,隨著 web 的發展,我們開發出了需要登陸的,能夠與伺服器互動的動態**。這個時候採用無狀態的 http 協議的伺服器就會出出現乙個問題:一旦有使用者登陸了乙個** a,然後他點選了** a 的乙個連線跳轉到** b ,但是由於 http 協議的無狀態性,在向** b 傳輸資料報時,不能向** b 傳輸他在** a 中登入的資訊,結果在** b 上,我們的使用者還得再登入一遍。這樣無狀態的設計在這個時候就很不合理了。

為了解決 http 的無狀態問題,人們設計出了 cookie 和 session 技術。

cookie是瀏覽器儲存在使用者電腦上的一小段文字,通俗的來講就是當乙個使用者通過http訪問到伺服器時,伺服器會將一些key/value鍵值對返回給客戶端瀏覽器,並給這些資料加上一些限制條件,在條件符合時這個使用者下次訪問這個伺服器時,資料通過請求頭又被完整地給帶回伺服器,伺服器根據這些資訊來判斷不同的使用者。

cookie 是伺服器傳給客戶端並儲存在客戶端的一段資訊,這個 cookie 是有大小,數量限制的!!

cookie 是有大小限制和數量限制的,並且越來越多的 cookie 代表客戶端和伺服器的傳輸量增加,可不可以每次傳的時候不傳所 cookie 值,而只傳乙個唯一id,然後將使用者資訊存在伺服器的乙個檔案上,通過這個id直接在伺服器查詢使用者資訊所在的 session 檔案呢?答案是有的,這就是我們的 session。

這個時候我們在傳輸 cookie 的時候就沒有必要傳輸所有的使用者資訊了,我們只要傳輸乙個 session id 就可以了,這樣就能節省傳輸的壓力,並且資訊量大的資料報在傳輸的時候越容易丟失部分資訊,況且現在計算機的硬碟速度和容量都很好,所以現在將使用者資訊儲存在遠端伺服器完全是划算的。

而且 session 機制能在一定程度上防止黑客通過篡改 cookie 包來實現越權漏洞等問題。比如說乙個 cookie 中一對鍵值對, key 是 admin 值是 1,來表示普通使用者。那麼黑客可能就能想到,假如這個地方值修改為 0,是不是伺服器就能把我識別成管理使用者呢。所以 cookie 這種用來鑑別使用者身份和許可權的東西,要盡可能少的暴露給客戶端。所以用 session 機制將部分 cookie 存在伺服器端可以在一定程度上避免這個問題。只要黑客拿不到管理員或者其他使用者的 session id,他就不能通過篡改 cookie 冒充管理員。並且 seesion id 為隨機生成,一般被黑客拿到的猜出來其他使用者的 seesion id 的難度很低。

文章參考:

為什麼不能用memcached儲存Session

memcached建立者dormando很早就寫過兩篇文章 1 2 告誡開發人員不要用memcached儲存session。他在第一篇文章中給出的理由大致是說,如果用memcached儲存session,那麼當memcached集 生故障 比如記憶體溢位 或者維護 比如公升級 增加或減少伺服器 時,...

http無狀態設計與Cookie和Session

無狀態指的是任意乙個web請求必須完全與其他請求隔離,當請求端提出請求時,請求本身包含了相應端為相應這一請求所需的全部資訊。1.被呼叫者不儲存引數,因為無需考慮引數邏輯 由使用者來儲存狀態,進行狀態邏輯設計 http是無狀態設計的,一些sdk的設計也可以是無狀態的。2.而一些需求是需要有互動的,需要...

為什麼CSRF Token寫在COOKIE裡面

最近做滲透測試的時候經常看到使用者的cookie資訊裡帶有csrf等字樣的資訊,問了一下同事,他們說這個是用來防禦csrf的字段。這一下可把我弄懵了,因為我對csrf的理解是 攻擊者盜用使用者的cookie執行非使用者本意的操作。我的想法是,使用者的cookie就像是一張門禁卡一樣,攻擊者可以盜用使...