http://mertensming.github.io/2016/10/19/cookie-session/
最近在用 Node.js
写一个 Web App,需要实现一个保持用户登陆状态的一个功能,每当用户进入这个 App 或者进行一些操作的时候,都要判断这个用户是否在登陆状态。我的思路是这样的,没进行一些操作(向服务端发起一个请求),都向服务端查询当前用户是否在登陆状态。那么,这样应该怎么实现呢?
下面就来谈谈我是怎么解决这个问题的。
要实现保持登录状态这个需求,第一步要做的就是登录。登录的操作就是,
用户A
在浏览器发送一个带有账号、密码的 POST 请求到服务器,如果服务器验证成功的话,就要告诉用户A
已经登录成功了。 很好,现在已经登录成功了,但是当用户A
再发送一个请求到服务器去获取用户A
的资料的时候,可是 HTTP 是无状态的协议,所以服务器根本不知道这个请求是谁、从哪里发出来的。
那么,怎么样才能让服务器知道它接收到的这个请求是谁发出来的?
在这里我只写一下 cookie 是怎样工作的,如果想详细了解 cookie 的话可以看看我这篇文章。
先不介绍 cookie 到底是什么,我们来看看 cookie
是如何工作的:
1. 没有 cookie 信息状态下的请求
2. 第 2 次以后(存有 cookie 信息状态)的请求
1. 首先,我们假设当前域名下还是没有 cookie 的2. 接下来,浏览器发送了一个请求给服务器(这个请求是还没带上 cookie 的)3. 服务器设置 cookie 并发送给浏览器(当然也可以不设置)4. 浏览器将 cookie 保存下来5. 接下来,以后的每一次请求,都会带上这些 cookie,发送给服务器 |
---|
看到这里就应该能够想到可以怎么解决上面的那个问题了吧。
我们可以将在
用户A
登录请求的那个响应中,设置用户A
已经登录的 cookie。那么当用户A
再次发送其他请求的时候,就会带上这个 cookie,服务器就可以识别到这是已经登录了的用户A
。
但是,这样做就可以了吗?
cookie 虽然很方便,但是使用 cookie 有两个的弊端:
为了解决这些问题,就产生了 session,那么 session 又是怎样工作的呢?
这意思就是说,当你浏览一个网页时,服务端随机产生一个很长的字符串,然后存在你 cookie 中。当你下次访问时,cookie 会带有这个字符串,然后浏览器就知道你是上次访问过的某某某,然后从服务器的存储中取出上次记录在你身上的数据。由于字符串是随机产生的,而且位数足够多,所以也不担心有人能够伪造。
session 的储存有四个常用选项:内存、 cookie、缓存、数据库
如果非要使用 cookie 来记录登陆的用户凭证,也不是不可以,只需要做一些对 cookie 做一个哈希处理就好了。
这样一来,用户就没法伪造信息了。一旦它更改了 cookie 中的信息,则服务器会发现 hash 校验的不一致。
毕竟他不懂我们的 secret_string 是什么,而暴力破解哈希值的成本太高。