查看原文
其他

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

码中人 码农真经 2024-02-11

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

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

Session/Cookie/Token/JWT

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

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

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

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

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

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

总的来说,

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

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

Session 和 Token 的优缺点

Session:

优点:

  1. 1. 安全性较高:Session 存储在服务器端,不容易被篡改。

  2. 2. 可以在服务器端主动管理和注销用户的 Session。

缺点:

  1. 1. 服务器压力大:服务器需要为每个用户维护一个 Session,当用户量增加时,服务器的内存压力会增大。

  2. 2. 不适合分布式系统:在分布式系统中,如果用户的请求被路由到不同的服务器,需要额外的机制来共享 Session。

Token:

优点:

  1. 1. 无状态,适合分布式系统:Token 通常存储在客户端,服务器不需要维护用户的状态,更适合于分布式系统和移动应用。

  2. 2. 扩展性好:Token 可以包含任意的 JSON 数据,可以灵活地添加额外的用户信息。

缺点:

  1. 1. 安全性问题:Token 存储在客户端,如果被窃取,可能会被用于恶意请求。

  2. 2. 无法在服务器端主动注销:一旦 Token 被发出,服务器无法主动使其失效,只能等到 Token 过期。为了解决这个问题,可以将 Token 存储在数据库中,并在数据库中记录 Token 的状态。

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

参考资料

  • • RFC 7519 - JSON Web Token (JWT)[2]

  • • RFC 6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage[3]

  • • RFC 6265 - HTTP State Management Mechanism[4]

  • • ENPHP/application/system/auth at master · beyondye/ENPHP[5]

  • • RFC 6265 - HTTP State Management Mechanism[6]

  • • Cookie和Session有什么区别?- 知乎[7]

往期推荐

欢迎关注我的公众号“码农真经”,原创技术文章第一时间推送。

引用链接

[1] 面了个十年经验的开发, 连 Session/Cookie/Token/JWT 都讲不明白 - V2EX: https://www.v2ex.com/t/1006401
[2] RFC 7519 - JSON Web Token (JWT): https://datatracker.ietf.org/doc/html/rfc7519
[3] RFC 6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage: https://datatracker.ietf.org/doc/html/rfc6750
[4] RFC 6265 - HTTP State Management Mechanism: https://datatracker.ietf.org/doc/html/rfc6265
[5] ENPHP/application/system/auth at master · beyondye/ENPHP: https://github.com/beyondye/ENPHP/tree/master/application/system/auth
[6] RFC 6265 - HTTP State Management Mechanism: https://datatracker.ietf.org/doc/html/rfc6265
[7] Cookie和Session有什么区别?- 知乎: https://www.zhihu.com/question/19786827


继续滑动看下一个

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

码中人 码农真经
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存