为什么需要 Token,Session
HTTP 是短连接,每次请求获取完数据后就断开了,如果有多个用户访问,我们无法区分哪些调用是A用户的,哪些是B用户的,以及之前调用过什么接口,也就是我们常说的 http 连接是无状态的。
为了解决这个问题,就有了 Token、Session、Cookie 这三个东西。
Session、Cookie 是什么
为了区分每个用户,或者说记住他们的状态,我们可以在服务端创建一块空间(创建 Session 对象),记录这个用户的信息,并且可以根据一个key(session id)访问到这块区域的信息,然后把这个 key 返回给客户端,客户端把这个 key 保存好(设置到 Cookie 中),之后客户端每次发起新的请求时都会在头部带上我们的 session id (自动带上的),服务端就能根据 session id 找到这个用户的信息了,也就能区分不同的访问用户了。
总结下:
Session 是在服务端的,用来存储用户的信息;Cookie 是在客户端的,可以用来存储 Session id(还可以存储其他东西)。
Session 空间比较大,因为是在服务端,可以存储用户敏感信息,不会泄露;Cookie 有大小限制,因为是在客户端,不应该存储敏感信息,容易暴露。
Session 是依赖 Cookie 的,需要它存储 Session Id。
Session 可以存储多种类型的值,Cookie 只能存储字符串类型的。
Token 是什么
Token 中文叫令牌,也是用来解决用户状态的问题,最常见的例子就是登录状态了。
用户登陆成功后,服务端返回一个 Token 给客户端,客户端把这个 Token 保存到 SessioniStorage 或者 LocalStorage 中,之后发起新的请求时,手动的把 Token 设置到头部的 Authorization 参数中(也可以自定义参数名,常用的是这个),服务端解析这个 Token 就能知道你是谁了。
那么 Token 到底长什么样,大概这样:
eyJhbGciOiJIUzI1NiI.eyJzaWduVHMiOjE2MjM3MMwODEwfQ.s_CFOkQSmTLHUKLKJkjsdal
这是一段经过加密后的 Token,里面包含了 userid 等信息(可以自定义需要包含的数据)。
当前最流行的 Token 实现是 JWT 也就是 Json Web Token,有各种语言的实现,可以方便的为你生成加密 Token 以及解密出来里面的信息。
Token 和 Session 的区别、优缺点
有了 Session 就可以解决用户状态问题了,为什么还需要 Token ?
这是因为 Session 有它的不足点:
Token 只有一串加密后的字符串,不需要服务端存储,不依赖 Cookie(可以用其他方式存储在客户端),多台服务器之间不需要做数据同步,它更加灵活方便,所以现在越来越多的应用都是用 Token 方式了。