Cookie 和 Session 的使用简记

http://mertensming.github.io/2016/10/19/cookie-session/

最近在用 Node.js 写一个 Web App,需要实现一个保持用户登陆状态的一个功能,每当用户进入这个 App 或者进行一些操作的时候,都要判断这个用户是否在登陆状态。我的思路是这样的,没进行一些操作(向服务端发起一个请求),都向服务端查询当前用户是否在登陆状态。那么,这样应该怎么实现呢?

下面就来谈谈我是怎么解决这个问题的。

要实现保持登录状态这个需求,第一步要做的就是登录。登录的操作就是,用户A 在浏览器发送一个带有账号、密码的 POST 请求到服务器,如果服务器验证成功的话,就要告诉 用户A 已经登录成功了。 很好,现在已经登录成功了,但是当 用户A 再发送一个请求到服务器去获取 用户A 的资料的时候,可是 HTTP 是无状态的协议,所以服务器根本不知道这个请求是谁、从哪里发出来的。

那么,怎么样才能让服务器知道它接收到的这个请求是谁发出来的?

cookie

在这里我只写一下 cookie 是怎样工作的,如果想详细了解 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

但是,这样做就可以了吗?

session

cookie 虽然很方便,但是使用 cookie 有两个的弊端:

  1. cookie 中的所有数据在客户端就可以被修改。这就意味着数据非常容易被伪造,一些重要的数据就不能存放在 cookie 中
  2. 而且如果 cookie 中数据字段太多会影响传输效率。

session 是如何工作的?

为了解决这些问题,就产生了 session,那么 session 又是怎样工作的呢?

  1. 每个 session 都对应一个 session_id,通过 session_id 可以查询到对应的 session
  2. session_id 通常是存放在客户端的 cookie 中,服务端存好 session 之后将对应的 session_id 设置在 cookie 中发送给客户端
  3. 当请求到来时,服务端检查 cookie 中保存的 session_id 并通过这个 session_id 与服务器端的 session 关联起来,进行数据的保存和修改

这意思就是说,当你浏览一个网页时,服务端随机产生一个很长的字符串,然后存在你 cookie 中。当你下次访问时,cookie 会带有这个字符串,然后浏览器就知道你是上次访问过的某某某,然后从服务器的存储中取出上次记录在你身上的数据。由于字符串是随机产生的,而且位数足够多,所以也不担心有人能够伪造。

session 储存

session 的储存有四个常用选项:内存、 cookie、缓存、数据库

  1. 内存:开发环境存内存比较方便,问题是不能够共享状态(只能在本机访问)
  2. cookie:使用 cookie 来储存 session 的话,session 保存在用户浏览器端,每次用户访问时,都会主动带上他自己的信息。安全性的话,只要遵照最佳实践来,也是有保证的。它的弊端是增大了数据量传输,好处是比较方便
  3. 缓存:可以共享
  4. 数据库:可以共享

signedCookie

如果非要使用 cookie 来记录登陆的用户凭证,也不是不可以,只需要做一些对 cookie 做一个哈希处理就好了。

这样一来,用户就没法伪造信息了。一旦它更改了 cookie 中的信息,则服务器会发现 hash 校验的不一致。

毕竟他不懂我们的 secret_string 是什么,而暴力破解哈希值的成本太高。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cnblogs

基于ko-easyui实现的PC前端模板功能完善

上一篇博客我向大家介绍了基于ko-easyui实现的开发模板,博客地址:https://cloud.tencent.com/developer/article/...

30520
来自专栏用户2442861的专栏

解决stackoverflow打开慢不能注册登录

问题原因:并不是stackoverflow被墙,而是因为stackoverflow用了google的api,而Google在天朝是用不了的,所以才导致像stac...

47310
来自专栏开源优测

SQL注入测试神器sqlmap

SQL注入测试神器sqlmap 介绍 sqlmap 是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。 它具有功能强大...

46380
来自专栏IT技术精选文摘

网站海量数据和高并发解决方案(二)

除了数据量大,另外一个常见的问题就是并发量高,很多架构就是针对这个问题设计出来的。 1.应用和静态资源分离 刚开始的时候应用和静态资源是保存在一起的,当并发量达...

27080
来自专栏hadoop学习

DKhadoop安装配置详细教程与常见问题解决方法

上周分别就DKHadoop的安装准备工作以及服务器操作系统配置写了两篇分享的文章,这是个人第一次尝试写一个系统性的分享文章,必然会有很多疏漏的地方,还望见谅吧。...

5200
来自专栏康中良的专栏

crontab在一秒内刷新多次导致部分脚本不生效的问题分析

stat为系统函数调用,该函数取得的结构体的`st_mtime`的单位为秒。今天ob在几台DB上发现crontab中的监控任务,从来没有执行。但操作一下cron...

3.5K00
来自专栏cvm功能

通过控制台vnc方式登录云主机

1)打开控制台,点击到云服务器的实例一栏,找到要登录的云主机,点击最右侧的操作栏的登录按钮。

6.1K110
来自专栏菩提树下的杨过

基于thrift的微服务框架

前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍...

25380
来自专栏张首富-小白的成长历程

alias设置别名使用的时候报错:-bash: this: command not found

使用alias指定别名的时候一定要使用‘’将原来的命令引起来,防止特殊字符发生错误。

51440
来自专栏FreeBuf

英特尔放出Linux微代码以修复Meltdown和Spectre漏洞

近日,Intel发布了最新版本的Linux处理器微代码数据文件,而这个补丁文件能够修复Intel CPU中的Spectre以及Meltdown漏洞。广大用户可以...

23860

扫码关注云+社区

领取腾讯云代金券