session、cookie和token的區別


session、cookie和token的區別

cookie機制

​ web應用程序是使用HTTP協議來傳送數據的。而HTTP是無狀態的協議。所以一旦HTTP報文交換完成,客戶端和服務器端就會誰也不認識誰了,這意味着服務器無法從連接上跟蹤會話。即當用戶A購買了一件商品並放入購物車中,當再次購買該商品時,服務器已經無法判斷是哪個用戶的會話了,所以才必須引入一種機制用於跟蹤會話。

​ cookie就是這樣的一種機制。因為HTTP是無狀態的,服務器是無法單單僅憑網絡連接是無法知道客戶身份的。所以這個時候服務器就會給客戶端發一個通行證,每個客戶端一個,無論誰訪問都必須攜帶自己的通行證,這樣服務器就能從通行證上確認客戶的身份。

​ 而這樣的通行證,也就是cookie,實際上是一小段文本信息。當客戶端請求服務器后,如果服務器需要記錄該用戶狀態,就會使用response回復報文向客戶端頒發一個通行證cookie。而客戶端收到cookie后會將cookie保存起來,當瀏覽器再次請求該網頁時,瀏覽器會連同cookie一同交給服務器。服務器檢查該cookie,以此辨認用戶狀態。

​ 查看某個網頁頒發的cookie很簡單,在瀏覽器地址處輸入javascript:alert(document.cookie)就可以了

​ 如果瀏覽器不支持瀏覽器cookie就會被ban掉,比如大部分手機瀏覽器就不支持。

不同的瀏覽器會采用不同的方式保存cookie,比如ie瀏覽器會在“C:\Documents and Settings\你的用戶名\Cookies”文件夾下以文本文件形式保存,一個cookie保存一個文件。

  • cookie是不可跨域名的。

  • cookie的有效期:cookie的maxage決定着cookie的有效期,單位為秒。cookie通過getMaxAge()和setMaxAge(int maxAge)方法來讀寫maxAge屬性。MaxAge屬性為正數時,表示該cookie會在MaxAge秒后自動失效。瀏覽器會將MaxAge為正數的cookie持久化,寫到對應的cookie文件中。無論客戶關閉了瀏覽器還是電腦,只要還在maxAge秒內,登錄該網站時該cookie仍然有效。但是MaxAge為負數時,則表示該cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內有效,關閉窗口后該cookie失效。這樣的cookie也會被視作臨時cookie,不會被瀏覽器持久化存儲,不會寫到cookie文件中。cookie信息保存在瀏覽器內存中,因此關閉了瀏覽器后該cookie就消失了。而如果MaxAge為0,則表示刪除該cookie。

Session機制

Session是另一種記錄客戶狀態的機制,不同的是cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是session。當客戶端瀏覽器再次訪問時只需要從該session中查找客戶的狀態就可以了。

如果說cookie機制是通過檢查客戶身上的通行證來確定客戶身份的話,那session機制就是通過檢查服務器上的客戶明細表來確認客戶身份的。session相當於程序在服務器上建立的一份客戶檔案,客戶來訪時只需要查詢客戶檔案就可以了。

  • session的生命周期:session保存在服務器端,而為了盡可能提升存取速度,服務器一般把cookie放在內存里。每一個用戶都會有獨立的session,而如果session內容過於復雜,當大量客戶訪問服務器時可能導致內存溢出所以其內容要盡可能精簡。session在第一次訪問服務器的時候創建。session生成后,只要用戶繼續訪問,服務器就會更新session最后的訪問時間,並維護該session。

  • session的有效期:為防止內存溢出,服務器會把長時間都沒有活躍的session刪除。這個時間就是session的超時時間,如果超過時間沒有訪問服務器,session就自動失效了。

  • session對cookie的使用:session雖然保存在服務器上,但是其正常運行還是需要客戶端瀏覽器的支持。因為session需要使用cookie作為識別標志。Session在運作時會向客戶端瀏覽器發送一個名為JSESSIONID的Cookie,它的值為該session的id。session就依據該cookie來識別是否為同一用戶。該cookie為服務器自動生成的,它的maxAge屬性一般為-1,表示僅當前瀏覽器有效,並且個瀏覽器窗口之間不共享。

  • URL地址重寫:有些瀏覽器是不支持cookie的。這個時候就需要用到URL地址重寫,其原理是將該用戶session的id重寫到url地址中。服務器能夠解析重寫后的URL獲取session的id。在文件名的后面,在URL參數的前面添加了字符串“;jsessionid=XXX”。增添的jsessionid字符串既不會影響請求的文件名,也不會影響提交的地址欄參數。

session和cookie的區別

  • cookie數據存放在客戶端的瀏覽器上,session數據 放在服務器上。

  • cookie比session更不安全,別人可以分析存放在本地的cookie並進行cookie欺騙。(可考慮對cookie加密)

  • session會在一定時間內保存在服務器上。當訪問增多時,會比較占用服務器的內容,考慮到減輕服務器負擔,可以考慮使用cookie

  • 單個cookie保存的數據不能超過4K,瀏覽器都限制一個站點最多保存20個cookie。session沒有這種限制。

token機制

token也稱為令牌,是服務器生成的一串字符串,作為客戶端進行請求的一個標識。

當用戶第一次登錄后,服務器會生成一個token並將此token返回給客戶端,以后客戶端只需帶上這個token請求數據即可,無需再次帶上用戶名和密碼。(聽起來跟cookie有點像,但是跟cookie是由很大區別的,且聽我娓娓道來)

簡單token的組成:uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token的前幾位以哈希算法壓縮成一定長度的十六進制字符串,以防止token泄露)

cookie和token的區別

  • token存在哪兒都行,客戶端可存放在localstorage或者cookie,而服務器端則會存放於數據庫(服務器端的session是直接放在內存中的)

  • cookie舉例:服務員看你的身份證后,給你一個編號,以后,進行任何操作,都出示編號,然后服務員再去查看你是誰

    token舉例:直接給服務員看自己的身份證

  • 對於token而言,服務器不需要去查看你是誰,是無狀態的,而cookie則是相對有狀態的。

  • token的可拓展性更強。

  • token可抵御csrf,因為cookie容易偽造,但是token是不容易偽造的。

參考文章

cookie和session的詳解與區別 - 測試開發喵 - 博客園 (cnblogs.com)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM