session和token都是用来保持会话,功能相同
一、session机制,原理
image.png- session是服务端存储的一个对象主要用来存储所以访问过过服务端的客户端的用户信息,从而实现保持用户会话状态。但是服务器重启时,内存会被销毁,存储的用户信息也就消失了。
不同的用户访问服务端的时候会在session对象中存储键值对。“键”用来存储开启这个用户信息的“钥匙”,在登录成功后“钥匙”通过cookie返回给客户端,客户端存储sessuinId记录在cookie中。客户端再次访问时,会默认携带cookie中的sessionID实现会话机制。
二、token机制,原理
image.png- token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用户验证后,服务端生成一个 token(hash 或 encrypt)发给客户端,客户端可以放到 cookie 或 localStorage 中,每次请求时在 Header 中带上 token ,服务端收到 token 通过验证后即可确认用户身份。
请求登录时,token和sessionId原理相同,是对key和key对应的用户信息进行加密后的加密字符,登录成功后,会在响应主体中将{token:'字符串'}返回给客户端。客户端通过cookie、sessionStorage、localStorage都可以进行存储。再次请求时不会默认携带,需要在请求拦截器位置给请求头中添加认证字段Authorization携带token信息,服务器端就可以通过token信息查找用户登录状态。
三、对比结论
- token 存在 localStorage 可避免 CSRF(cookie、sessionStorage、localStorage都可以进行存储),session存在cookie中并且默认携带存在风险。
- session在服务端停止或者重启时会丢失,token无状态无需存储
- 分布式使用session需要解决session共享的问题,token无需同步,每个服务器都可以验证
- session过多时可能导致服务器内存占用问题
网友评论