cookie、session、token
会话
会话是浏览器和服务器之间的多次请求和响应,也就是说,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话。
HTTP无状态
网页之间的交互是通过HTTP协议传输数据的,而Http协议是无状态的协议,数据提交后,浏览器和服务器的链接就会关闭,服务器无法确认用户的信息。
Cookie概念(客户端会话技术)
Cookie是一个服务器发送给浏览器,在浏览器上保存的一个小文件。浏览器第一次访问服务器时,服务器会校验用户名和密码是否存在,如果存在则生成一个cookie,cookie上记录着用户名和密码,把小文件发送给浏览器保存。
注意:
- Cookie具有不可跨域名性
- HTTP协议不仅是无状态的,而且是不安全的!如果不希望Cookie在非安全协议中传输,可以设置Cookie的secure属性为true,浏览器只会在HTTPS和SSL等安全协议中传输该Cookie
Session概念(服务器会话技术)
Session是用来将数据存储与服务器端的技术,服务器会为每次会话建立一个sessionId,每个客户会跟一个sessionID对应。session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。
注意
- Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,无论是否对Session进行读写,服务器都会认为Session活跃了一次。
- HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session依据Cookie来识别是否是同一个用户
Cookie和Session的区别
- | Cookie | Session |
存储方式 | 只能存储字符串 | 可以存储任何类型的数据 |
隐私安全 | 存储在浏览器中,对客户端是可见的。信息容易泄露出去 | 存储在服务器上,对客户端是透明的。不存在敏感信息泄露问题 |
有效期 | 保存在硬盘中,设置maxAge属性,即使关闭浏览器,Cookie还是存在的 | 保存在服务器中,设置maxInactiveInterval属性。并且依赖名为JSESSIONID的Cookie |
服务器负担 | 保存在客户端的。不占用服务器的资源 | 保存在服务器的,每个用户都会产生一个Session,如果是并发访问的用户非常多,会消耗大量的内存 |
浏览器支持 | 如果浏览器禁用了Cookie,那么Cookie是无用的 | 如果浏览器禁用了Cookie,Session可以通过URL地址重写来进行会话跟踪 |
跨域名 | 可以设置domain属性来实现跨域名 | 不可跨域名 |
Token概念
在用户登录成功之后,服务端会根据传过来的唯一标识userId,运用一些算法,并加上密钥,生成一个Token,然后通过BASE64编码一下之后将这个Token返回给客户端,客户端将Token保存起来。下次请求时,客户端只需在header里边带上token,服务器收到请求后,会用相同的算法和密钥去验证Token,如果两者一致,则请求成功,否则失败。使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录,以CPU换内存。
最简单的Token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由Token的前几位+哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接Token请求服务器)。
大致流程
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者数据库里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据