session cookie Token cookie session Token

cookie

cookie 是一個文本文件 存儲在瀏覽器目錄

Cookie意爲“甜餅”,是由W3C組織提出,最早由Netscape社區發展的一種機制。目前Cookie已經成爲標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。由於HTTP是一種無狀態的協議,服務器單從網絡連接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容。

cookie是由服務器保存在用戶瀏覽器上的一塊數據,它可以包含有關用戶的信息,比如登錄的狀態,用戶標識等

主要用在以下三個方面:

會話狀態管理(如用戶登錄狀態、購物車)

個性化設置(如用戶自定義設置)

瀏覽器行爲跟蹤(如跟蹤分析用戶行爲)

cookie的處理步驟


1、server通過HTTP Response中的"Set-Cookie: header"把cookie發送給client
2、client把cookie通過HTTP Request 中的“Cookie: header”發送給server
3、每次HTTP請求,Cookie都會被髮送。

http請求發送cookies的條件:

1、本地已經緩存有cookies
2、根據請求的URL來匹配cookies的domain、path屬性,如果都符合纔會發送。[url的匹配規則]

iOS客戶端:cookies會保存在App的沙盒下

在iOS 中使用 Cookies

NSHTTPCookieStorage 這個類就是一個單例,它的主要任務就是管理 Cookies, 增刪改查等各種

NSURLRequest NSURLRequest是HTTP請求協議URL資源的消息對象Request

NSHTTPURLResponse

NSHTTPURLResponse 是HTTP協議請求URL資源的響應消息對象。這個對象將HTTP協議的序列化了,可以很方便的獲得的狀態碼(statusCode),消息報頭(allHeaderFields)等信息

退出登錄(清除Cookie)
+ (void)exitCleanCookies{

    //Host : http://cart.ev.com/cart-admin/
    //獲取BaseUrl 的Cookie  
    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [NSURL URLWithString:Host]];

    for (NSHTTPCookie * cookie in cookies){
        //清除本地的Cookie (退出登錄)
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}
Cookie信息:

<NSHTTPCookie version:0 name:"JSESSIONID" value:"7DD6A8E30F40E1D8515DB3A39FBF32C3" 
expiresDate:(null) created:2017-03-22 06:46:49 +0000 sessionOnly:TRUE 
domain:"cart.ev.com" partition:"none" path:"/cart-admin" isSecure:FALSE>

客戶端創建Cookie

當服務器收到HTTP請求時,可以在響應頭裏面增加一個Set-Cookie頭部。瀏覽器收到響應之後會取出Cookie信息並保存,之後對該服務器每一次請求中都通過Cookie請求頭部將Cookie信息發送給服務器。大概都長的都是這個格式:

Set-Cookie: <cookie名稱>=<cookie值>

客戶端的cookie

NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:@{NSHTTPCookieName:@"username",
                                                                  NSHTTPCookieValue:@"test",
                                                                  NSHTTPCookiePath:@"/",
                                                                  NSHTTPCookieDomain:@"https://www.baidu.com"}];

NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage setCookies:@[cookie] forURL:baseUrl mainDocumentURL:nil];

session

主要用來記錄用戶狀態,區分用戶。服務端要爲特定的用戶創建特定的Session,用於標識這個用戶,並且跟蹤用戶的後續操作,狀態保存在服務器端

SessionID的本質

一、客戶端用cookie保存了sessionID

客戶端用cookie保存了sessionID,當我們請求服務器的時候,會把這個sessionID一起發給服務器,服務器會到內存中搜索對應的sessionID,如果找到了對應的 sessionID,說明我們處於登錄狀態;如果沒找到,這說明:要麼是我們把瀏覽器關掉了,要麼session超時了,session被服務器清除了,則服務器會給你分配一個新的sessionID。你得重 新登錄並把這個新的sessionID保存在cookie中。

在沒有把瀏覽器關掉的時候(這個時候假如已經把sessionID保存在cookie中了)這個sessionID會一直保存在瀏覽器中,每次請求的時候都會把這個sessionID提交到服務器,所以服務器認爲我們是登錄的;如果長時間沒有請求服務器,服務器會認爲我們已經把瀏覽器關掉了,這個時候服務器會把該sessionID從內存中清除掉,這個時候我們再去請求服務器的話,sessionID已經不存在了,服務器在內存中沒有找到對應的 sessionID,所以會再產生一個新的sessionID,這個時候一般我們又要再登錄一次。

當有客戶端訪問服務器時,服務器根據需求設置Session,將會話信息保存在服務器上(主要存儲的的SessionID和Session內容,同時也包含了很多自定義的內容如:用戶基礎信息、權限信息、用戶機構信息、固定變量等),這個數據可以保存在集羣、數據庫、文件中,用於跟蹤用戶的狀態。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了

用戶第一次登錄後,瀏覽器會將用戶信息發送給服務器,服務器會爲該用戶創建一個SessionID,並在響應內容(Cookie)中將該SessionID一併返回給瀏覽器,瀏覽器將這些數據保存在本地. 當用戶再次發送請求時,瀏覽器會自動的把上次請求存儲的Cookie數據自動的攜帶給服務器。服務器接收到請求信息後,會通過瀏覽器請求的數據中的SessionID判斷當前是哪個用戶,然後根據SessionID在Session庫中獲取用戶的Session數據返回給瀏覽器。

Token

HTTP請求都是以無狀態的形式對接。即HTTP服務器不知道本次請求和上一次請求是否有關聯。所以就有了Session的引入,即服務端和客戶端都保存一段文本,客戶端每次發起請求都帶着,這樣服務器就知道客戶端是否發起過請求。

這樣,就導致客戶端頻繁向服務端發出請求數據,服務端頻繁的去數據庫查詢用戶名和密碼並進行對比,判斷用戶名和密碼正確與否。而Session的存儲是需要空間的,頻繁的查詢數據庫給服務器造成很大的壓力。
  
在這種情況下,Token應用而生

Token是服務端生成的一串字符串,以作客戶端進行請求的一個令牌。當客戶端第一次訪問服務端,服務端會根據傳過來的唯一標識userId,運用一些算法,並加上密鑰,生成一個Token,然後通過BASE64編碼一下之後將這個Token返回給客戶端,客戶端將Token保存起來(可以通過數據庫或文件形式保存本地)。下次請求時,客戶端只需要帶上Token,服務器收到請求後,會用相同的算法和密鑰去驗證Token。
最簡單的Token組成:uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,由Token的前幾位+鹽以哈希算法壓縮成一定長的十六進制字符串,可以防止惡意第三方拼接Token請求服務器)。

使用基於 Token 的身份驗證方法,在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的:

客戶端使用用戶名跟密碼請求登錄
服務端收到請求,去驗證用戶名與密碼
驗證成功後,服務端會簽發一個Token,再把這個Token發送給客戶端
客戶端收到Token以後可以把它存儲起來,比如放- 在Cookie裏或者數據庫裏
客戶端每次向服務端請求資源的時候需要帶着服務端簽發的Token
服務端收到請求,然後去驗證客戶端請求裏面帶着的 Token,如果驗證成功,就向客戶端返回請求的數據

前端繞過驗證方式:逆向工程
https://www.jianshu.com/p/685bdb9a1626

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章