您好,登錄后才能下訂單哦!
本篇內容主要講解“什么是Cookie、Session、Token”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是Cookie、Session、Token”吧!
通俗地講就是驗證當前用戶的身份,證明“你是你自己”(比如:你每天上下班,進出小區,都要指紋識別,如果當前指紋和系統庫中錄入的匹配,就認證成功)
互聯網中的認證:
用戶名密碼登錄
郵箱發送登錄鏈接
手機號接收驗證碼
只要你能收到郵箱/驗證碼,就默認你是賬號的主人
用戶授予第三方應用訪問該用戶某些資源的權限
你在安裝手機應用的時候,APP 會詢問是否允許授予權限(訪問相冊、地理位置等權限)
你在訪問微信小程序時,當登錄時,小程序會詢問是否允許授予權限(獲取昵稱、頭像、地區、性別等個人信息)
實現授權的方式有:cookie、session、token、OAuth
實現認證和授權的前提是需要一種媒介(證書)來標記訪問者的身份
在戰國時期,商鞅變法,發明了照身帖。照身帖由官府發放,是一塊打磨光滑細密的竹板,上面刻有持有人的頭像和籍貫信息。國人必須持有,如若沒有就被認為是黑戶,或者間諜之類的。(可以理解為我們當前的身份證)
在現實生活中,每個人都會有一張專屬的居民身份證,是用于證明持有人身份的一種法定證件。通過身份證,我們可以辦理手機卡/銀行卡/個人貸款/交通出行等等,這就是認證的憑證。
在互聯網應用中,一般網站(如掘金)會有兩種模式,游客模式和登錄模式。游客模式下,可以正常瀏覽網站上面的文章,一旦想要點贊/收藏/分享文章,就需要登錄或者注冊賬號。當用戶登錄成功后,服務器會給該用戶使用的瀏覽器頒發一個令牌(token),這個令牌用來表明你的身份,每次瀏覽器發送請求時會帶上這個令牌,就可以使用游客模式下無法使用的功能。
HTTP是無狀態的協議(對于事務處理沒有記憶能力,每次客戶端和服務端會話完成時,服務端不會保存任何會話信息): 每個請求都是完全獨立的,服務端無法確認當前訪問者的身份信息,無法分辨上一次的請求發送者和這一次的發送者是不是同一個人。所以服務器與瀏覽器為了進行會話跟蹤(知道是誰在訪問我),就必須主動的去維護一個狀態,這個狀態用于告知服務端前后兩個請求是否來自同一瀏覽器。而這個狀態需要通過 cookie 或者 session 去實現。
cookie 存儲在客戶端: cookie 是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上。
cookie 是不可跨域的: 每個 cookie 都會綁定單一的域名,無法在別的域名下獲取使用,一級域名和二級域名之間是允許共享使用的(靠的是 domain)。
cookie重要的屬性
session是另一種紀錄服務器和客戶端會話狀態的機制
session 是基于 cookie 實現的,session 存儲在服務器端,sessionId 會被存儲到客戶端的cookie 中
session 認證流程:
用戶第一次請求服務器的時候,服務器根據用戶提交的相關信息,創建對應的Session
請求返回時將此Session的唯一標識信息SessionID返回給瀏覽器
瀏覽器接收到服務器返回的 SessionID 信息后,會將此信息存入到 Cookie 中,同時 Cookie 記錄此 SessionID 屬于哪個域名
當用戶第二次訪問服務器的時候,請求會自動判斷此域名下是否存在 Cookie 信息,如果存在自動將 Cookie 信息也發送給服務端,服務端會從 Cookie 中獲取 SessionID,再根據 SessionID 查找對應的 Session 信息,如果沒有找到說明用戶沒有登錄或者登錄失效,如果找到 Session 證明用戶已經登錄可執行后面操作。
根據以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋梁,大部分系統也是根據此原理來驗證用戶登錄狀態。
安全性:Session比Cookie安全,Session是存在服務器端的,Cookie是存在客戶端的。
存取值的類型不同:Cookie 只支持存字符串數據,想要設置其他類型的數據,需要將其轉換成字符串,Session 可以存任意數據類型。
有效期不同: cookie的生命周期可以通過cookie.setMaxAge(2000);來設置,如果沒有設置setMaxAge,則cookie的生命周期當瀏覽器關閉的時候,就消亡了,cookie的生命周期是累計的,從創建時,就開始計時,20分鐘后,cookie生命周期結束,session的生命周期是間隔的,從創建時,開始計時如在20分鐘,沒有訪問session,那么session生命周期被銷毀但是,如果在20分鐘內(如在第19分鐘時)訪問過session,那么,將重新計算session的生命周期。
Acesss Token
訪問資源接口(API)時所需要的資源憑證
簡單 token 的組成: uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token 的前幾位以哈希算法壓縮成的一定長度的十六進制字符串)
特點
服務端無狀態化、可擴展性好
支持移動端設備
安全
支持跨程序調用
token 的身份驗證流程
客戶端使用用戶名跟密碼請求登錄
服務端收到請求,去驗證用戶名與密碼
驗證成功后,服務端會簽發一個 token 并把這個 token 發送給客戶端
客戶端收到 token 以后,會把它存儲起來,比如放在 cookie 里或者 localStorage 里
客戶端每次向服務端請求資源的時候需要帶著服務端簽發的 token
服務端收到請求,然后去驗證客戶端請求里面帶著的 token ,如果驗證成功,就向客戶端返回請求的數據
每一次請求都需要攜帶 token,需要把 token 放到 HTTP 的 Header 里
基于 token 的用戶認證是一種服務端無狀態的認證方式,服務端不用存放 token 數據。用解析 token 的計算時間換取 session 的存儲空間,從而減輕服務器的壓力,減少頻繁的查詢數據庫
token 完全由應用管理,所以它可以避開同源策略
Session 是一種記錄服務器和客戶端會話狀態的機制,使服務端有狀態化,可以記錄會話信息。而 Token 是令牌,訪問資源接口(API)時所需要的資源憑證。Token 使服務端無狀態化,不會存儲會話信息。
Session 和 Token 并不矛盾,作為身份認證 Token 安全性比 Session 好,因為每一個請求都有簽名還能防止監聽以及重放攻擊,而 Session 就必須依賴鏈路層來保障通訊安全了。如果你需要實現有狀態的會話,仍然可以增加 Session 來在服務器端保存一些狀態。
所謂 Session 認證只是簡單的把 User 信息存儲到 Session 里,因為 SessionID 的不可預測性,暫且認為是安全的。而 Token ,如果指的是 OAuth Token 或類似的機制的話,提供的是 認證 和 授權 ,認證是針對用戶,授權是針對 App 。其目的是讓某 App 有權利訪問某用戶的信息。這里的 Token 是唯一的。不可以轉移到其它 App上,也不可以轉到其它用戶上。Session 只提供一種簡單的認證,即只要有此 SessionID ,即認為有此 User 的全部權利。是需要嚴格保密的,這個數據應該只保存在站方,不應該共享給其它網站或者第三方 App。所以簡單來說:如果你的用戶數據可能需要和第三方共享,或者允許第三方調用 API 接口,用 Token 。如果永遠只是自己的網站,自己的 App,用什么就無所謂了。
使用 cookie 時需要考慮的問題
因為存儲在客戶端,容易被客戶端篡改,使用前需要驗證合法性
不要存儲敏感數據,比如用戶密碼,賬戶余額
使用 httpOnly 在一定程度上提高安全性
盡量減少 cookie 的體積,能存儲的數據量不能超過 4kb
設置正確的 domain 和 path,減少數據傳輸
cookie 無法跨域
一個瀏覽器針對一個網站最多存 20 個Cookie,瀏覽器一般只允許存放 300 個Cookie
移動端對 cookie 的支持不是很好,而 session 需要基于 cookie 實現,所以移動端常用的是 token
使用 session 時需要考慮的問題
將 session 存儲在服務器里面,當用戶同時在線量比較多時,這些 session 會占據較多的內存,需要在服務端定期的去清理過期的 session
當網站采用集群部署的時候,會遇到多臺 web 服務器之間如何做 session 共享的問題。因為 session 是由單個服務器創建的,但是處理用戶請求的服務器不一定是那個創建 session 的服務器,那么該服務器就無法拿到之前已經放入到 session 中的登錄憑證之類的信息了。
當多個應用要共享 session 時,除了以上問題,還會遇到跨域問題,因為不同的應用可能部署的主機不一樣,需要在各個應用做好 cookie 跨域的處理。
sessionId 是存儲在 cookie 中的,假如瀏覽器禁止 cookie 或不支持 cookie 怎么辦? 一般會把 sessionId 跟在 url 參數后面即重寫 url,所以 session 不一定非得需要靠 cookie 實現
移動端對 cookie 的支持不是很好,而 session 需要基于 cookie 實現,所以移動端常用的是 token
使用 token 時需要考慮的問題
如果你認為用數據庫來存儲 token 會導致查詢時間太長,可以選擇放在內存當中。比如 redis 很適合你對 token 查詢的需求。
token 完全由應用管理,所以它可以避開同源策略
token 可以避免 CSRF 攻擊(因為不需要 cookie 了)
移動端對 cookie 的支持不是很好,而 session 需要基于 cookie 實現,所以移動端常用的是 token
不對。對 session 來說,除非程序通知服務器刪除一個 session,否則服務器會一直保留,程序一般都是在用戶做 log off 的時候發個指令去刪除 session。 然而瀏覽器從來不會主動在關閉之前通知服務器它將要關閉,因此服務器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分 session 機制都使用會話 cookie 來保存 session id,而關閉瀏覽器后這個 session id 就消失了,再次連接服務器時也就無法找到原來的 session。如果服務器設置的 cookie 被保存在硬盤上,或者使用某種手段改寫瀏覽器發出的 HTTP 請求頭,把原來的 session id 發送給服務器,則再次打開瀏覽器仍然能夠打開原來的 session。 恰恰是由于關閉瀏覽器不會導致 session 被刪除,迫使服務器為 session 設置了一個失效時間,當距離客戶端上一次使用 session 的時間超過這個失效時間時,服務器就認為客戶端已經停止了活動,才會把 session 刪除以節省存儲空間。
到此,相信大家對“什么是Cookie、Session、Token”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。