Express中设置cookie,session,token

cookie

Cookie是HTTP协议中请求头中的一个字段

作用:验证用户是否登录

Cookie是由服务器设置,由浏览器保存,cookie的内存空间是受到限制的,大约4kb

登录原理

HTTP协议是一个无状态的协议,理论上来说是无法保持登录的

当用户填写完数据并且点击提交按钮的时候,此时浏览器会发送一个HTTP请求到服务器,服务器得到响应并经过验证之后,会在响应头中set-cookie字段中设置用户的信息,之后返回给前端,前端检测到set-cookie字段中的内容之后,会生成一个cookie文件,将用户的信息保存起来。当下一次用户向同一个服务器发送请求的时候,会将cookie文件中的内容携带到服务器中,经过服务器验证之后,就可以判断出使用是否登录过。

例如:

用户名张三,当通过表单填写完数据之后,发送HTTP请求到服务器,服务器经过验证用户信息无误的时候,会在响应头中的set-cookie字段中设置用户的信息: username=张三;password=123456,之后返回给前端,前端经过检测set-cookie中的内容之后,会生成cookie文件,将用户的信息保存起来,之后再次向同一个服务器发送请求的时候,会将cookie文件中的内容带到服务器中,服务器经过验证之后,就可以判断出用户是否登录

设置cookie

使用方式:res.cookie(key, value, options)

  key: 数据名称

  value: 设置的数据

  options: 配置项

获取cookie

想要获取cookie中的内容 必须借助中间件cookie-parser,引入中间件后通过app.use()安装,安装cookie一定要在安装路由对象之前,否则获取的值为undefined

通过req.cookies对象获取

浏览器端获取cookie数据,通过document.cookie属性获取

 

session

Session是服务器上的一段内存空间,也是用于存储数据。但是Session依赖于Cookie

cookie将信息存储在客户端,有大小限制;session将信息存储在服务器端,大小取决于服务器的大小。

Session是服务器上的一段内存空间,通常是保存一些重要的信息,一些不重要的信息保存在cookie中就好。

登录原理:

当用户通过表单或者是ajax发送请求的时候,浏览器会发出一个HTTP请求到服务器,服务器得到响应并开始处理,之后返回一个随机字符(也叫作密钥),该字符串对于浏览器来说没有什么作用, 但是对于服务器来说,可以通过该随机字符串识别用户的信息,之后返回数据给前端,并在响应头的set-cookie中设置用户的信息(随机字符串)。之后,浏览器检测cookie字段中的内容,会生成一个cookie文件,当再次向同一个服务器发送请求的时候,则会将cookie中的内容(随机字符串)携带到服务器中,然后经过服务器处理之后,就可以判断用户是否登录过

设置session

在Express中可以通过req.session用于设置以及获取session

当想要获取session中的内容时,需要借助中间件 express-session

并且要进行配置:

app.use(expressSession({

  secret: 配置密钥

  resave: 每一次访问session时,是否重置,布尔值

  saveUninitialized: 在初始化时是否设置session,布尔值

}))

token

含义:凭证、令牌。是由服务器自定义加密的一种手段

生成:由后端生成 存储:存储在前端的cookie中或者本地存储中

格式:头部,数据,签名

作用:验证用户身份

流程机制:客户端使用用户名跟密码发送登录请求。服务端收到请求,去验证用户名与密码

验证成功后,服务端会生成一个 Token字符串,再把这个 Token字符串发送给客户端,服务器端不会保留该Token字符串。

客户端收到 Token字符串,可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里。客户端每次向服务端请求资源的时候需要带着服务端签发的 Token字符串。

服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,响应本次请求,如果验证失败则服务器可以拒绝

token 特点:

服务器无状态:因为服务器只负责解密而不负责存储

把所有状态信息都附加在 Token 上,服务器就可以不保存。但是服务端仍然需要认证 Token 有效。

只要服务端能确认是自己签发的 Token,而且其信息未被改动过,那就可以认为 Token 有效。“签名”就是做这个的。

Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。

前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。

JWT标准:

因为这个过程的验证并不是HTTP协议中规定的方式,而是自定义的。所以很可能每个公司就有自己的使用方式。所以,就出现了标准。

标准的 Token 有三个部分:

header(头部)

payload(数据):iss:Issuer,发行者;sub:Subject,主题;aud:Audience,观众;exp:Expiration time,过期时间;nbf:Not before;iat:Issued at,发行时间;jti:JWT ID

signature(签名):header,payload,secret

使用步骤

  1 引入jwt(jsonwebtoken)模块

  2 定义指定加密字符串

  3 当用户登录成功之后,通过jwt提供了sign方法。可以将用户的信息以及加密字符串捆绑到一起生成token字符串

  4 将用户的信息返回给前端,前端可以将token字符串保存在本地存储中

  5 当前端再次发送请求的时候,将token字符串携带到服务器中

  6 经过jwt提供的verify方法进行解密。之后返回给前端

 

sign方法:

  jwt.sign(req.body, secret)

    req.body: 用户名和密码信息(客户端提交的)

    secret: 创建的秘钥

verify方法:

  jwt.verify(req.query.token, secret, (err, result) => {})

    req.query.token: sign方法创建的token数据

    secret:sign方法创建的秘钥

    回调函数中的参数:

      err:错误信息(如果为null则证明成功)

      result:返回用户名和密码(客户端提交的数据)

 

服务器端代码:

 

 前端index首页登录成功后,获取服务器端携带的token并存储在localStorage中,并跳转到demo页面去验证:

 

demo页面获取存储在localStorage中的token,向后端发送携带token的请求

 

posted @ 2021-05-13 21:53  没有茅台喝啤酒也行  阅读(789)  评论(0)    收藏  举报