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 有两个的弊端:
cookie 中的所有数据在客户端就可以被修改。这就意味着数据非常容易被伪造,一些重要的数据就不能存放在 cookie 中而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,那么 session 又是怎样工作的呢?
每个 session 都对应一个 session_id,通过 session_id 可以查询到对应的 sessionsession_id 通常是存放在客户端的 cookie 中,服务端存好 session 之后将对应的 session_id 设置在 cookie 中发送给客户端当请求到来时,服务端检查 cookie 中保存的 session_id 并通过这个 session_id 与服务器端的 session 关联起来,进行数据的保存和修改这意思就是说,当你浏览一个网页时,服务端随机产生一个很长的字符串,然后存在你 cookie 中。当你下次访问时,cookie 会带有这个字符串,然后浏览器就知道你是上次访问过的某某某,然后从服务器的存储中取出上次记录在你身上的数据。由于字符串是随机产生的,而且位数足够多,所以也不担心有人能够伪造。
session 的储存有四个常用选项:内存、 cookie、缓存、数据库
内存:开发环境存内存比较方便,问题是不能够共享状态(只能在本机访问)cookie:使用 cookie 来储存 session 的话,session 保存在用户浏览器端,每次用户访问时,都会主动带上他自己的信息。安全性的话,只要遵照最佳实践来,也是有保证的。它的弊端是增大了数据量传输,好处是比较方便缓存:可以共享数据库:可以共享如果非要使用 cookie 来记录登陆的用户凭证,也不是不可以,只需要做一些对 cookie 做一个哈希处理就好了。
这样一来,用户就没法伪造信息了。一旦它更改了 cookie 中的信息,则服务器会发现 hash 校验的不一致。
毕竟他不懂我们的 secret_string 是什么,而暴力破解哈希值的成本太高。
