Cookis、Session、Token概念及区别
一、Cookie
1.1 Cookie概述
Cookie是由服务器发送给浏览器,并保存在本地的一小块数据。
由于HTTP协议是无状态的,而通过Cookie可以稳定地保存一些状态。
当服务器将Cookie发送给浏览器本地保存后,此后的每一次请求浏览器都会将cookie发给服务器。
主要作用
1.会话状态管理
2.个性化设置
3.浏览器行为跟踪
Cookie曾是唯一的客户端数据存储手段,而每次浏览器请求都会携带Cookie数据会增加开销。
当服务器收到HTTP请求后,服务器可以在响应首部里面添加一个Set-Cookie选项。浏览器收到响应后通常会保存下Cookie。
Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。
1.2 Cookie类型
会话期Cookie
浏览器关闭后自动删除,仅在会话期间有效。会话期Cookie不需要指定过期时间(Expires)或这有效期(Max-Age)。提供会话恢复功能的浏览器,在关闭后会话期Cookie也会被保留下来,如同浏览器从未关闭一样。
持久性Cookie
持久性Cookie可以指定过期时间或有效期。关闭浏览器也不会失效。
Cookie的过期或有效期只与客户端时间相关,而非服务器时间。
第三方Cookie
每个Cookie都有与之相关联的域,当Cookie的域和页面的域相同,则称之为第一方Cookie(First-Party Cookie),而不过不同,则称之为第三方Cookie(Third-Party Cookie)。
通过第三方组件发送的第三方Cooike主要用于广告和网络追踪。
1.3 Cookie的属性
| 参数 | 描述 |
|---|---|
| Name | 规定Cookie的名称。(必须) |
| Value | 规定Cookie的值,可以进行转码和加密。(必须) |
| Expire | 规定Cookie的过期日期(GMT格式)。当超过这个日期,浏览器将删除Cookie。 |
| MaxAge | 规定Cookie失效时间,单位是秒,默认为-1。如果为负数,则为临时Cookie,关闭浏览器即删除。如果为0,则表示删除该Cookie(并非浏览器关闭时才删除)。 |
| Path | 规定Cookie的服务器路径。一般设为“/”,以表示同一个站点的所有页面都可以访问这个Cookie。 |
| Domain | 规定Cookie的子域名。指定在该子域下才可访问Cookie。 |
| Secure | 规定是否通过安全的HTTPS连接来传输Cookie。 |
| HttpOnly | 不能通过程序(如:Java Script)调用并读取到Cookie的内容。 |
| SameSite | Cookie允许服务器要求某个Cookie在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)。 |
SameSite一般有3个值:
1.None
浏览器会在同站请求、跨站请求下继续发送Cookie,不区分大小写。
2.Strict
浏览器将只发送同站点请求的Cookie,如果请求来自与当前location不同的URL,则不发送包括了Strict熟悉的Cookie。
3.Lax
默认选项。Same-Site Cookie会为一些跨站子请求保留,如图片加载或者frames的调用,但只要当用户从外部站点导航到URL时才会发送,如Link连接。
1.4 Cookie总结
Cookie是一种在客户端存储数据的方式。它不见得与用户认证登录相关。
二、Session
2.1 Session概述
由于Cookie保存在客户端,所以会存在安全隐患。
而Session保存在服务端。
2.2 Session特性
- 当Session创建后,服务端会将SessionID放到此次访问的Cooike中。当下次客户端访问需要提取服务器中Session时,会根据Cooike中的SessionID值来找到服务器中的具体Session。
2.3 Session同步问题
在大型的分布式网站中,由于后端有多台服务器,并且每次请求可能会访问到任意一台服务器。而session只保存在一台服务器上。这会导致状态丢失,如重新登录等问题。
解决方法
1.session复制
2.客户端保存session(保存在Cookie中,可以保存不敏感信息,但是Cookie容量有限。)
3.固定客户端访问的服务器
- ip Hash
- 业务数据 Hash
4.共享存储
- 使用redis存储
但是与Cookie一样,使用Session方式更加安全,但是都会增加开销。
2.4 Session总结
Session是一种用户会话状态实现的手段。在客户端,Session ID通常使用Cookie进行存储;而在服务器端,可以使用的存储方法就太多了。
三、Token
3.1 Token概述
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
3.2 Token的优势
1.无状态、可扩展
在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。如果我们将已验证的用户的信息保存在Session中,则每次请求都需要用户向已验证的服务器发送验证信息(称为Session亲和性)。用户量大时,可能会造成 一些拥堵。但是不要着急。使用tokens之后这些问题都迎刃而解,因为tokens自己hold住了用户的验证信息。
2.安全性
请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。
3.可扩展性
Tokens能够创建与其它程序共享权限的程序。例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。
4.多平台跨域
我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。
5.基于标准
创建token的时候,你可以设定一些选项。最近的程序和文档是供给JSON Web Tokens的。它支持众多的语言。这意味在未来的使用中你可以真正的转换你的认证机制。
3.3 Token与Session的区别
Token使用CPU算力换空间的方式。免去存储大量Session的开销,同样也不会出现session同步的问题。可以方便地进行服务器集群的横向扩展。
简单来说,使用session数据放在服务器端(文件、内存、数据库),而Token的数据,主要放在客户端(LocalStorge、Cookie)。