Please enable Javascript to view the contents

经典面试题:Session/Cookie/Token/JWT的作用和区别

 ·  ☕ 3 分钟

面了个十年经验的开发, 连 Session/Cookie/Token/JWT 都讲不明白 - V2EX

面了个十年经验的开发, 连 Session/Cookie/Token/JWT 都讲不明白 - V2EX

Session/Cookie/Token/JWT

今天看到一个帖子,说面了个十年经验的开发,连 Session/Cookie/Token/JWT 都讲不明白。我觉得十年经验的Web开发,如果连这些基础的东西都讲不明白,确实有点说不过去。为了避免自己重蹈覆辙,我也来总结一下。

首先,为什么会出现这些技术?因为 HTTP 协议是无状态的,服务器无法识别用户。为了解决这个问题,就出现了 Session、Cookie、Token 和 JWT。它们的作用都是为了识别用户,从而实现用户身份验证和会话管理。

  1. Session:Session 是在服务器端存储的用户会话信息。当用户登录后,服务器会创建一个 Session,并将 Session ID 发送给客户端。客户端在后续的请求中会带上这个 Session ID,服务器通过这个 ID 来识别用户。

  2. Cookie:Cookie 是在客户端存储的数据,通常用于保存用户的偏好设置,或者保存 Session ID。服务器可以设置 Cookie,然后由浏览器在后续的请求中自动发送。

  3. Token:Token 是一种无状态的身份验证机制。服务器在用户登录后生成一个 Token,并发送给客户端。客户端在后续的请求中会带上这个 Token,服务器通过验证这个 Token 来识别用户。Token 可以存储在任何地方,如 Cookie、LocalStorage 等。

  4. JWT (JSON Web Token):JWT 是一种特殊的 Token,它将用户信息加密到 Token 中。服务器可以通过解密 Token 来获取用户信息,无需查询数据库。JWT 通常用于无状态的 RESTful API。

总的来说,

  1. Session和 Token 是两种认证机制。Cookie 和 LocalStorage 等是存储Session ID或Token的载体。

  2. Session 和 Cookie 是传统的基于状态的身份验证机制,而 Token 和 JWT 是现代的无状态身份验证机制。无状态的身份验证机制更适合于分布式系统和移动应用。

Session 和 Token 的优缺点

Session:

优点:

  1. 安全性较高:Session 存储在服务器端,不容易被篡改。
  2. 可以在服务器端主动管理和注销用户的 Session。

缺点:

  1. 服务器压力大:服务器需要为每个用户维护一个 Session,当用户量增加时,服务器的内存压力会增大。
  2. 不适合分布式系统:在分布式系统中,如果用户的请求被路由到不同的服务器,需要额外的机制来共享 Session。

Token:

优点:

  1. 无状态,适合分布式系统:Token 通常存储在客户端,服务器不需要维护用户的状态,更适合于分布式系统和移动应用。
  2. 扩展性好:Token 可以包含任意的 JSON 数据,可以灵活地添加额外的用户信息。

缺点:

  1. 安全性问题:Token 存储在客户端,如果被窃取,可能会被用于恶意请求。
  2. 无法在服务器端主动注销:一旦 Token 被发出,服务器无法主动使其失效,只能等到 Token 过期。为了解决这个问题,可以将 Token 存储在数据库中,并在数据库中记录 Token 的状态。

下一篇文章,会通过代码来演示如何使用 Session 和 Token。

参考资料

RFC 7519 - JSON Web Token (JWT)

RFC 6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage

RFC 6265 - HTTP State Management Mechanism

ENPHP/application/system/auth at master · beyondye/ENPHP

RFC 6265 - HTTP State Management Mechanism

Cookie和Session有什么区别? - 知乎

分享

码中人
作者
码中人
Web Developer