接口測試基礎-cookie、session、token學習

目的:了解cookie和session區別,并且了解app端為什么不用cookie、session,而用token。


一、了解cookie和session區別

我們在請求頭中經常會見到如下的部分:

Cookie: ZC8sid=m5PMgK; AJSTAT_ok_pages=5; AJSTAT_ok_times=1;ZC8cookietime=2592000;ZC8_auth=e558Bn9amQVa818V1epYBenUnNCUXW7vdUc3XZdMLRsVI26O40Bd5CqE%2F4Oj47WW245X04JeCjpyiUxBDwBpiJEfI0dxow;checkpm=1; supe_cookietime=2592000;supe_loginuser=wg101523413;supe_activationauth=9f6dNKMyRfxDJ82LeRptq1GkxzAzGTsCTAcF9B6DTI94uxzoK%2FOo2A

在響應頭中也經常看到set-cookie,那那么cookie是干嘛用的呢?和session的區別在哪兒呢?

通過圖解http書中兩張圖學習一下:

Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集群、數據庫、文件中;Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。

從這兩張圖可以看出,cookie分為setCookie和Cookie,前者為響應頭字段,后者為請求頭字段;而請求頭和響應頭均包含Session ID,響應頭包含的Session ID字段是為了記錄用戶認證狀態,請求頭中Session ID是方便服務端來判斷客戶端是否為真實的用戶。接下來我們詳細看下兩者的區別:

1.session在服務器端,cookie在客戶端(瀏覽器)

2.session默認被存在在服務器的一個文件里(不是內存)

3.session的運行依賴session id,而session id 是存在cookie 中的,也就是說,如果瀏覽器禁用了cookie ,同時session 也會失效(但是可以通過其它方式實現,比如在 url 中傳遞 session_id)

4.用戶驗證這種場合一般會用session

因此,維持一個會話的核心就是客戶端的唯一標識,即session id ;cookie目的可以跟蹤會話,也可以保存用戶喜好或者保存用戶名密碼;session用來跟蹤會話。

二、為什么app端為什么不用cookie、session,而用token

那么app中為什么很少看到用cookie或session,而要用token呢?這三者有什么區別呢?

首先了解下REST,即Representational State Transfer的縮寫。我對這個詞組的翻譯是"表現層狀態轉化"。 簡單來說,RESTful API 是基于HTTP協議產生的一種相對簡單的API設計方案,屬于無狀態傳輸。RESTful 的核心是 everything is a “resource”,所有的HTTP action,都應該是相應resource上可以被操作和處理的,而API 就是對資源的管理操作,而這個具體操作是由 HTTP action 指定的。

App通常用restful API跟server打交道。Rest是stateless的,也就是app不需要像browser那樣用cookie來保存session,因此用session token來標示自己就夠了,session/state由API server的邏輯處理。

如果你的后端不是stateless的rest API, 那么你可能需要在app里保存session,可以在app里嵌入webkit,用一個隱藏的browser來管理cookie session.

session 和 oauth token 并不矛盾,作為身份認證token安全性比session好,因為每個請求都有簽名sign(Sign怎么生成的:將所有用戶請求的參數按照字母排序(包括timestamp,token),然后根據MD5加密(可以加點鹽),生成sign簽名,這就是所說的url簽名算法。),所以token+sign還能防止監聽以及重放攻擊,而session就必須靠鏈路層來保障通訊安全了。

參考資料:《圖解HTTP》——[日]上野 宣

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容