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

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