1. 程式人生 > >cookies/session/token

cookies/session/token

game coo 頻繁 客戶端請求 直接 over 來源 返回 csrf

cookie 和session 的區別:

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

2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。

3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。

4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

5、所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一.Token的來源:
當客戶端多次向服務端請求數據時,服務端就需要多次從數據庫中查詢用戶名和密碼並進行對比,判斷用戶名和密碼是否正確,並作出相應提示。但這樣無疑會增加服務器端的運行壓力,是否可以有一種方式只需要驗證用戶就是之前的用戶而不需要每次在客戶端請求數據時都需要查詢數據庫判斷用戶名和密碼是否正確。在這種請求下,引入了token來解決服務器端多次訪問數據庫問題。

1.什麽是Token:
Token是服務端端生成的一串字符串,作為客戶端進行請求時辨別客戶身份的的一個令牌。當用戶第一次登錄後,服務器生成一個Token便將此Token返回給客戶端,以後客戶端只需帶上這個Token前來請求數據即可,無需再次帶上用戶名和密碼。

2.使用Token的目的:

Token的目的是為了驗證用戶登錄情況以及減輕服務器的壓力,減少頻繁的查詢數據庫,使服務器更加健壯。

二. Token的運用流程:
當用戶首次登錄成功之後, 服務器端就會生成一個 token 值,這個值,會在服務器保存token值(保存在數據庫中),再將這個token值返回給客戶端;

客戶端拿到 token 值之後,進行保存 (保存位置由服務器端設置);

以後客戶端再次發送網絡請求(一般不是登錄請求)的時候,就會將這個 token 值附帶到參數中發送給服務器.;

服務器接收到客戶端的請求之後,會取出token值與保存在本地(數據庫)中的token值進行比較;

如果兩個 token 值相同, 說明用戶登錄成功過!當前用戶處於登錄狀態;

如果沒有這個 token 值, 沒有登錄成功;

如果 token 值不同: 說明原來的登錄信息已經失效,讓用戶重新登錄;

Token一般用在兩個地方:

  • 1)防止表單重復提交、
  • 2)anti csrf攻擊(跨站點請求偽造)。

兩者在原理上都是通過session token來實現的。當客戶端請求頁面時,服務器會生成一個隨機數Token,並且將Token放置到session當中,然後將Token發給客戶端(一般通過構造hidden表單)。下次客戶端提交請求時,Token會隨著表單一起提交到服務器端。
然後,如果應用於“anti csrf攻擊”,則服務器端會對Token值進行驗證,判斷是否和session中的Token值相等,若相等,則可以證明請求有效,不是偽造的。
不過,如果應用於“防止表單重復提交”,服務器端第一次驗證相同過後,會將session中的Token值更新下,若用戶重復提交,第二次的驗證判斷將失敗,因為用戶提交的表單中的Token沒變,但服務器端session中Token已經改變了。

上面的session應用相對安全,但也叫繁瑣,同時當多頁面多請求時,必須采用多Token同時生成的方法,這樣占用更多資源,執行效率會降低。因此,也可用cookie存儲驗證信息的方法來代替session Token。比如,應對“重復提交”時,當第一次提交後便把已經提交的信息寫到cookie中,當第二次提交時,由於cookie已經有提交記錄,因此第二次提交會失敗。
不過,cookie存儲有個致命弱點,如果cookie被劫持(xss攻擊很容易得到用戶cookie),那麽又一次gameover。黑客將直接實現csrf攻擊。

所以,安全和高效相對的。具體問題具體對待吧。

cookies/session/token