Cookie 是保存在客户端用于身份认证的标识数据
认证流程是, 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时 在 header 的 Cookie 字段中带上
Session 是基于 Cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中
用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session 请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器
浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名
当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息
Token 的认证流程是
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会生成一个 Token , Token 由 头部, 加密实体, 签名 通过 Base64 算法生成, 并把这个 token 发送给客户端
- 客户端收到 Token 以后,会把它存储起来,比如放在 Cookie 里或者 localStorage 里
- 客户端请求在 header 中带上 Token, 通常是 Authorization字段或者 Cookie 字段
- 服务端收到请求, 验证 Token
三者的区别是
- Token 有签名, Session Cookies 没有
- Cookie 有大小限制, 通常不能超过 4KB, 其他的没限制
- Session 保存在服务端, 另外两个保存在客户端
- Session 通常用于会话记录, 动机是使服务端有状态, 失效时间短, 另外两个通常用于获取某些资源凭证, 设置较长的失效时间
- Token 可以跨域适合做单点登录, Session 和 Cookie 是不可跨域的, 每个 Cookie 都会绑定单一的域名,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
- Cookie 是跟域名绑定的, Session 是跟单次浏览器标签绑定的, Token 是跟用户代理终端