即前端存储cookie相关内容,又看到了token,session,JWT感觉有点混乱了
一. 授权、鉴权与身份验证
首先搞清楚鉴权,授权和身份验证
- 身份验证(authentication): 确认用户的身份,需要用户提供证明自己身份的凭证。例如:用户登录网站时需要 (用户名+密码),系统通过匹配存储的凭据来验证用户是否是真实的。身份验证的结果: 系统确认用户是谁,但还不知道用户有权执行哪些操作。
- 授权(authorization: 经过身份验证的用户是否有权限去执行一些操作或者访问一些资源。 授权的结果 系统允许或拒绝用户执行特定操作或访问资源。
- 鉴权: 包含了 (身份验证+授权)
二.鉴权的两种常用机制
(1) cookie-session鉴权
流程:
- 用户登录: 用户登录时提交用户名和密码到服务器;
- 服务器验证: 服务器验证用户名和密码;
- 创建Session: 验证成功后,服务器创建一个Session,并将sessionId发送给客户端。通过
setcookie('sessionId', 'id_value')
- 客户端存储sessionId: 客户端收到Session ID后,通常将其存储在Cookie中。
- 请求携带Cookie: 客户端在后续的每次请求中,都会自动在HTTP请求头中携带Cookie。
- 服务器验证sessionId: 服务器收到请求后,通过Cookie中的sessionId查找对应的Session。
- 处理请求: 验证通过后,服务器处理请求并返回响应。
setcookie(name,value, expire, path, domain, secure, httponly, samesite);
优点:
- 安全性较高,可以通过cookie的
HttpOnly
和Secure
属性增强其安全性;- 服务器能够控制session的失效;
缺点:
- 服务器端需要存储session信息,增加服务器的存储压力;
- 不支持跨域共享session;
(2) JWT (JSON Web Tokens) 鉴权机制
流程:
- 用户登录: 用户登录时提交用户名和密码到服务器;
- 服务器验证: 服务器验证用户名和密码;
- 生成JWT并返回给用户: 服务器验证成功后生成一个JWT,也就是一个包含用户标识信息并通过密钥签名的token,将JWT返回到客户端;
- 客户端接收并存储JWT: 客户端接收到请求后将JWT存储在localStorage或者sessionStorage中;
cookie也不是一定不能存储
- 客户端请求携带JWT: 客户端在后续的每次请求中,都会在HTTP请求头(一般是authorization 字段)中携带JWT;
- 服务器验证JWT: 服务器收到请求后验证JWT的有效性,包括签名、过期时间等, 确认用户的身份和权限。
JWT的身份信息,权限,有效期等信息都包含在这个token中,有效期是由其中的exp字段来控制
优点:
无状态验证
, 由于JWT是自包含的,无需服务器存储跟踪每个JWT的状态,服务器只需验证JWT的签名,时间戳等信息来决定token是否生效。跨域支持
:JWT可以很容易在不同的域之间共享。缺点:
- token长度较大,会占用较大的带宽;
- token一旦签发,就无法在服务器端废除,直到过期;
安全问题: 为了安全,JWT通常设定较短的有效期(15min或者1h),防止token被盗后长期有效。JWT过期,服务器会拒绝请求返回
401 Unauthorized
两种机制的适用场景
- JWT适合用于分布式系统、微服务架构和需要跨域认证的场景、单点登录,多个app之间的身份互验(从支付宝登录淘宝)
- Cookie-Session适合用于传统的单体应用,以及对安全性要求较高的场景,小型或者单一域名。
那么总结一下最初的疑问吧!
- cookie其实就是前端存储,用于存储一些较小的数据,用户登录状态之类。可以在每次发送请求的时候,跟随域名(domain属性)相同的请求被发送到服务器。有
HttpOnly
、Secure
、samesite
属性来确保一定的安全性,能够防止XSS攻击和CSRF攻击,具有一定的有效时间(由服务器控制)。 - token的话就是令牌,用于表征用户身份信息。可以存储在localStorage,sessionStorage或者cookie中。localStorage中居多,这种情况需要开发者手动读取token。存储在localStorage中的token也容易受到XSS的攻击,因此其有效时间会比较短。
- session就是服务器端的会话,管理和不同用户之间的交互数据。使得无状态的http可保存用户信息。
- JWT是一种特殊的token,用于用户身份验证和授权的~
版权归原作者 JAMJAM_NoName 所有, 如有侵权,请联系我们删除。