Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Session,Cookie 和 Token 的关系与区别 #9

Open
SuperTapir opened this issue May 21, 2020 · 0 comments
Open

Session,Cookie 和 Token 的关系与区别 #9

SuperTapir opened this issue May 21, 2020 · 0 comments
Labels

Comments

@SuperTapir
Copy link
Owner

对于基本的 Session 和 Cookie 的关系相信大部分人都明白。Token 也是我们做用户认证非常常用的工具,但是作为一个前度工程师,还是经常会对其中的概念感到混乱,所以在写本文的过程中,我希望能够将这三个概念区分清楚。

Cookie

首先,说说我最熟悉的 Cookie。

Cookie 就是指存储在客户端的小型存储。在进行 HTTP 请求的时候,一般会自动携带上 Cookie 信息。

Cookie 可以指定一个特定的过期时间(Expires)或有效期(Max-Age)。如果不设置的话,就是会话期Cookie,在浏览器关闭后会被自动删除。

当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。

另外,还可以设置 SecureHttpOnly 标记

  • Secure 只应通过被HTTPS协议加密过的请求发送给服务端
  • HttpOnly JavaScript 无法访问的 Cookie

Session

我觉得相比于 Cookie 这种真实存在的东西来说,Session 更像是一种概念性的东西。是为了给 无状态的HTTP协议 施加状态而产生的。

举个例子,一个用户进行登录操作,服务端保存用户当前的会话信息到某个介质(内存或者本地存储)。这个过程可以认为生成了一个 Session信息。接着从会话信息中拿出一个当前会话的 ID (session ID)并通过 HTTP响应 设置Cookie保存在客户端。之后该客户端的请求就会携带 session ID 的信息,服务端再和本地保存的 Session 进行查找对比,就能认出该用户了。这维持了一个HTTP的会话。

Token

Token 也是一种抽象的概念。它是辨认用户信息的标识,用来进行授权等操作。

Token 可以在服务端进行持久化。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

另外,也有将Token 等会话信息直接保存在客户端的方案,比如 JWT。

JWT(JSON Web Token)

JWT 是一种 Token 的实现标准。使用 JSON 作为 Token。

JWT 将会话信息全部保存在客户端,这样服务端就是无状态的了,利于后续扩展。

最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

参考资料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant