面了个十年经验的开发, 连 Session/Cookie/Token/JWT 都讲不明白 - V2EX
Session/Cookie/Token/JWT
今天看到一个帖子,说面了个十年经验的开发,连 Session/Cookie/Token/JWT 都讲不明白。我觉得十年经验的Web开发,如果连这些基础的东西都讲不明白,确实有点说不过去。为了避免自己重蹈覆辙,我也来总结一下。
首先,为什么会出现这些技术?因为 HTTP 协议是无状态的,服务器无法识别用户。为了解决这个问题,就出现了 Session、Cookie、Token 和 JWT。它们的作用都是为了识别用户,从而实现用户身份验证和会话管理。
-
Session:Session 是在服务器端存储的用户会话信息。当用户登录后,服务器会创建一个 Session,并将 Session ID 发送给客户端。客户端在后续的请求中会带上这个 Session ID,服务器通过这个 ID 来识别用户。
-
Cookie:Cookie 是在客户端存储的数据,通常用于保存用户的偏好设置,或者保存 Session ID。服务器可以设置 Cookie,然后由浏览器在后续的请求中自动发送。
-
Token:Token 是一种无状态的身份验证机制。服务器在用户登录后生成一个 Token,并发送给客户端。客户端在后续的请求中会带上这个 Token,服务器通过验证这个 Token 来识别用户。Token 可以存储在任何地方,如 Cookie、LocalStorage 等。
-
JWT (JSON Web Token):JWT 是一种特殊的 Token,它将用户信息加密到 Token 中。服务器可以通过解密 Token 来获取用户信息,无需查询数据库。JWT 通常用于无状态的 RESTful API。
总的来说,
-
Session和 Token 是两种认证机制。Cookie 和 LocalStorage 等是存储Session ID或Token的载体。
-
Session 和 Cookie 是传统的基于状态的身份验证机制,而 Token 和 JWT 是现代的无状态身份验证机制。无状态的身份验证机制更适合于分布式系统和移动应用。
Session 和 Token 的优缺点
Session:
优点:
- 安全性较高:Session 存储在服务器端,不容易被篡改。
- 可以在服务器端主动管理和注销用户的 Session。
缺点:
- 服务器压力大:服务器需要为每个用户维护一个 Session,当用户量增加时,服务器的内存压力会增大。
- 不适合分布式系统:在分布式系统中,如果用户的请求被路由到不同的服务器,需要额外的机制来共享 Session。
Token:
优点:
- 无状态,适合分布式系统:Token 通常存储在客户端,服务器不需要维护用户的状态,更适合于分布式系统和移动应用。
- 扩展性好:Token 可以包含任意的 JSON 数据,可以灵活地添加额外的用户信息。
缺点:
- 安全性问题:Token 存储在客户端,如果被窃取,可能会被用于恶意请求。
- 无法在服务器端主动注销:一旦 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