前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Cookie 和 Session 的使用简记

Cookie 和 Session 的使用简记

作者头像
bear_fish
发布2018-09-19 12:15:08
7400
发布2018-09-19 12:15:08
举报

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 是什么,而暴力破解哈希值的成本太高。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • cookie
    • cookie 是怎么工作的?
    • session
      • session 是如何工作的?
        • session 储存
        • signedCookie
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档