Cookie Session和Token

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

一、Cookie

1.1 什么是Cookie

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。Cookie相当于客户端的通行证。

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客 户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

单个Cookie保存的数据不能超过4K。
Cookie的本职工作并非是本地存储,而是状态维持。
Cookie的典型应用场景有自动登录(记住密码)、购物车功能、记录用户行为(做商品/广告推荐)等。

1.2 Cookie具有不可跨域名性

Cookie具有不可跨域名性。Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作 Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。 但是可以通过domain来设置可以访问该cookie的域名。

1.3 Unicode编码:保存中文

中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。
提示:Cookie中保存中文只能编码。一般使用UTF-8编码即可

1.4 BASE64编码:保存二进制图片

Cookie不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据。例如在Cookie中使用数字证书,提供安全度。使用二进制数据时也需要进行编码。
注意:Cookie中可以存储二进制内容,但并不实用。由于浏览器每次请求服务器都会携带Cookie,因此Cookie内容不宜过多,否则影响速度。Cookie的内容应该少而精。

二、Session

2.1 什么是Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。

客户端浏览器访问服务器的时候,服务器开辟一个内存,叫session,把客户端信息以某种形式记录在服务器上。将相应的sessionId在响应中返回给客户端,客户端将sessionId存储,后续请求时将sessionId传到服务端,就可以访问它的session信息。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

用户离开网站后session会被销毁

为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

2.2 session的两种实现方式

2.2.1 使用cookie保存sessionId(禁用)
2.2.2 URL重写

就是把sessionId直接附加在URL路径的后面,通过response.encodeURL()方法。

Session中禁止使用Cookie, 也就是方法1禁止使用
既然WAP上大部分的客户浏览器都不支持Cookie,索性禁止Session使用Cookie,统一使用URL地址重写会更好一些。

三、Token

3.1 什么是Token

token 也称作令牌,由uid+time+sign[+固定参数]
token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 非常适合于 REST API 的场景. 所谓无状态就是服务端并不会保存身份认证相关的数据。
token在客户端一般存放于localStorage,cookie,或sessionStorage中。

3.2 token认证流程

  1. 用户登录,成功后服务器返回Token给客户端。
  2. 客户端收到数据后保存在客户端
  3. 客户端再次访问服务器,将token放入headers中
  4. 服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码

3.3 为什么使用Token不用Session了

  1. 负载均衡:session是有状态的,一般存于服务器内存或硬盘中,当服务器采用分布式或集群时,session就会面对负载均衡问题。负载均衡多服务器的情况,不好确认当前用户是否登录,因为多服务器不共享session。
    而token是无状态的,token字符串里就保存了所有的用户信息,服务端就不需要存储session占用存储空间
  2. token可以抵抗csrf,cookie+session不行
  3. session每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
  4. session不能跨域。token可以
  5. 可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。Tokens能够创建与其它程序共享权限的程序,使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。

你可能感兴趣的:(Cookie Session和Token)