Home » 未分类 » 身份认证之 Session 与 Token

身份认证之 Session 与 Token

HTTP 是无状态的,全部的请求都是无状态的。然而,某些情况下我们想让我们的状态能被记住。比如,浏览一家在线商店,当我们把香蕉放到购物车中后,再去其他页面购买苹果时,并不希望我们的香蕉消失。在在线商店的各个页面中穿梭时,我们是希望想我们的购买状态是能够被记住的!

为了克服 HTTP 请求无状态的性质,我们可以使用 session 或者 token。

基于 Session

基于 session 的认证中,用户登录后服务器会为登录用户创建一个 session,sessionid 会保存在用户浏览器的 cookie 中。当用户登录成功后,cookie 会随着后边的每个请求一起发送。这样,服务器通过 cookie 中的 sessionid 找到内存中的 session 数据,来验证用户身份,从而在响应中返回相应的状态。

 

基于 Token

很多网络应用使用 json web token 也即 JWT 来代替 session 实现身份认证。在这种基于 token 的应用中,服务器使用一个密钥来创建 jwt 并发送给客户端。客户端会保存此 jwt(通常保存在本地存储 local storage 中)并在每个请求的 header 中包含此 jwt。服务器验证客户端发来的每个请求中的 jwt ,做出响应。

它与 session 方式最大的不同是用户状态不存储在服务器端,而是存储在 token 中并保存在客户端。为了扩展性,大部分现代网络应用都使用 jwt 来进行用户认证。

扩展性

基于 session: 由于 session 存储于服务器端(一般是内存型数据库,如 redis),当用户量很大时会有一定的扩展性问题。
基于 token: 存储在客户端,不存在上边这个问题。

多设备

基于 session: cookie 通常工作在单个域名或其子域名下,而且跨域名时通常会被浏览器关闭。当 API 要服务于不同域名的移动和网络设备时,容易出现问题。
基于 token: 由于 jwt 包含于请求头当中,不存在 cookie 引发的相关的问题。

翻译自:Session vs Token Based Authentication

关于 jwt 的更多信息,可以参考阮一峰的文章《Json Web Token 入门教程》

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.