【Express】会话控制

1. 介绍

HTTP 是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端,无法区分用户。

我们需要通过会话控制来解决该问题,常见的会话控制技术有三种:

  • cookie
  • session
  • token

2. cookie

cookie 是 HTTP 服务器发送到用户浏览器并保存在本地的一小块数据。

cookie 是按照域名划分保存的。

浏览器向服务器发送请求时,会自动将当前域名下可用的 cookie 设置在请求头中,然后传递给服务器。比如:username=zhangsan&password=123456

这个请求头的名字也叫 cookie ,所以将 cookie 理解为一个 HTTP 的请求头也是可以的。有了 cookie 之后,后续向服务器发送请求时,就会自动携带 cookie。

服务通过响应报文的形式返回 cookie,比如set-cookie=zhangsan ,当浏览器接收响应后,发现该响应报文,然后将该响应报文中的 cookie 保存在该域名下的 cookie 中。

不同浏览器中的 cookie 是相互独立的,不共享。

3. session

session 是保存在服务器端的一块儿数据,保存当前访问用户的相关信息。

可以识别用户的身份,快速获取当前用户的相关信息。

填写账号和密码校验身份,校验通过后创建 session 信息 ,然后将 session_id 的值通过响应头返回给浏览器。

有了cookie ,下次发送请求时会自动携带 cookie,服务器通过 cookie 中的 session_id 的值确定用户的身份。

4. session 和 cookie 的区别

cookie 和 session 的区别主要有如下几点:

  1. 存在的位置
  • cookie:浏览器端
  • session:服务端
  1. 安全性
  • cookie 是以明文的方式存放在客户端的,安全性相对较低
  • session 存放于服务器中,所以安全性 相对 较好
  1. 网络传输量
  • cookie 设置内容过多会增大报文体积,会影响传输效率
  • session 数据存储在服务器,只是通过 cookie 传递 id,所以不影响传输效率
  1. 存储限制浏览器限制单个
  • cookie 保存的数据不能超过 4K,且单个域名下的存储数量也有限制
  • session 数据存储在服务器中,所以没有这些限制

5. token

token 是服务端生成并返回给 HTTP 客户端的一串加密字符串, token 中保存着 用户信息。

【Express】会话控制_第1张图片
token 的特点:

  • 服务端压力更小
    • 数据存储在客户端
  • 相对更安全
    • 数据加密
    • 可以避免 CSRF(跨站请求伪造)
  • 扩展性更强
    • 服务间可以共享
    • 增加服务节点更简单

5.1 JWT

// 导入 jsonwebtoken
const jwt = require('jsonwebtoken');

// 创建 token
const token = jwt.sign({
   username: 'zhangsan',
}, 'secret', { expiresIn: 60 
})

// 解析 token
jwt.verify(token, 'secret', (err, data) => {
   if(err) {
      console.log('token 解析失败')
      return
   } else {
      console.log(data)
   }
})

你可能感兴趣的:(Express,express)