1. Cookie
- Cookie是存储在浏览器端的一小段文本,可以用类记录用户的身份信息等数据。
如何通过 cookie 来实现用户确定或者权限的确定呢?
- 客户端发送请求到服务端(比如登录请求)。
- 服务端收到请求后生成一个 session 会话。
- 服务端响应客户端,并在响应头中设置 Set-Cookie。Set-Cookie 里面包含了 sessionId,它的格式如下:Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]。其中 sessionId 就是用来标识客户端的,类似于去饭店里面,服务员给你一个号牌,后续上菜通过这个号牌来判断上菜到哪里。
- 客户端收到该请求后,如果服务器给了 Set-Cookie,那么下次浏览器就会在请求头中自动携带 cookie。
- 客户端发送其它请求,自动携带了 cookie,cookie 中携带有用户信息等。
- 服务端接收到请求,验证 cookie 信息,比如通过 sessionId 来判断是否存在会话,存在则正常响应。
2. Session
- Session是存储在服务器端的一组数据,用于记录用户的会话信息,如登录状态,购物车等。
3. Cookie和Session联系与区别
联系:
sessionId 是 cookie 和 session 之间的桥梁。
- Cookie和Session常常一起使用,称谓Session+Cookie,通过在第一次请求时服务器生成一个信物,并要求客户端也定一个信物。每次请求时候你都得带上信物,你我信物一比对,验证通过则认为是同一个会话。
区别: - session 比 cookie 更加安全,因为它是存在服务端的,cookie 是存在客户端的。
- cookie 只支持存储字符串数据,session 可以存储任意数据。
- cookie 的有效期可以设置较长时间,session 有效期都比较短。
- session 存储空间很大,cookie 有限制
4. Token
前面我们说的 sessionId 可以叫做令牌,令牌顾名思义就是确认身份的意思,服务端可以通过令牌来确认身份。
- Token是一种认证方式,通常代表一小段字符串,可以存储到cookie里,遂请求一起发过去,也可以存在服务器中。
- Token的认证方式类似于临时的证书签名,是一种服务端无状态的认证方式,非常适用于REST API的场景。所谓无状态就是服务端不会保存身份认证相关数据。
- Token的安全性比Cookie和Session高,因为它不会被自动添加到请求头中,而是开发者为了防范CSRF而特别设计的令牌,浏览器不会自动添加到headers里,攻击者也无法访问用户的token,所以提交的表单无法通过服务器过滤,也就无法形成攻击
- Token是被加密后的字符串,通常由uid+time+sign[+固定参数]组成,服务器通过Payload,header和一个密钥(secret)使用Header里面指定的签名算法生成。我们通过jiangtoken解密就可以拿到注入uid这类信息,如何通过uid来进行接下来的鉴权操作。
- 客户端发起登录请求,比如用户输入用户名和密码后登录。
- 服务端校验用户名和密码后,将用户 id 和一些其它信息进行加密,生成 token。
- 服务端将 token 响应给客户端。
- 客户端收到响应后将 token 存储下来。
- 下一次发送请求后需要将 token 携带上,比如放在请求头中或者其它地方。
- 服务端 token 后校验,校验通过则正常返回数据。
5. 区别总结
- Cookie和Session是存储在客户端和服务端的认证方式,用于记录用户的身份信息和会话信息。
- Token是一种服务端无状态的认证方式,通常代表一小段字符串,可以存储到cookie里,遂请求一起发过去,也可以存在服务器中。
- Cookie和Session是Session+Cookie的组合方式,用于在第一次请求时服务器生成一个信物,并要求客户端也定一个信物。Token是一种基于临时证书签名的认证方式,适用于REST API的场景。
- Token的安全性比Cookie和Session更高,因为他不会被浏览器自动添加到请求头中,而是开发中为了防范CSRF而特别设计的令牌,浏览器不会自动添加到headers里,攻击者也无法访问用户的token,所以提交表单无法通过服务器过滤,也就无法形成攻击。
session是空间换时间,token是时间换空间