mis-lab / Front-End-Question-Discussion

前端基础问题 每日一题
1 stars 0 forks source link

Session & Token #46

Open trayvonRen opened 4 years ago

trayvonRen commented 4 years ago

HTTP 协议是无状态协议,所以服务器端必须部署相关的逻辑来保持用户的认证状态。 目前主流有两种 Session 和 Token

trayvonRen commented 4 years ago

Session

在计算机网络中, session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agentserver 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。
而我们今天常说的 Session,是借助 cookie 或者其他手段实现的,一种会话状态的具体实现,最常见的就是用户登录态的维持。

实现原理

一个简单的 Session 有以下过程

注意点

总结

安全性

如果 Cookie 被窃取了,攻击者就可以登录账号。
为了解决这个问题,可以采用以下方法

无论如何,都不应该把敏感信息放在 Cookie 中

缺点

trayvonRen commented 4 years ago

Token

基于 token 认证方式,不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于 token 认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。 流程上是这样的:

JSON Web Token(缩写 JWT)是 token 认证的一种具体实现。

JWT 的原理

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。

{
  "姓名": "张三",
  "角色": "管理员",
  "到期时间": "2018年7月1日0点0分"
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。 服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

JWT 的数据结构

阮一峰: JSON Web Token 入门教程

JWT 工作流程

可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面。

Authorization: Bearer <token>

总结

参考资料

Introduction to JSON Web Tokens