一篇文章带你搞懂 cookie session 和 jwt

服务器端渲染

使用 session

因为 http 协议是无状态的,这是使用 session 的前提。

就像进出学校的时候,如果保安就看一下你的校园卡,都不看你是不是校园卡上的样子,那么这时候校园卡就是 cookie

登录成功之后,服务器端会给浏览器颁发 cookie 。

cookie = Name + Value + (有效期、安全性、使用范围)

20220726145553

cookie 的特性:

  • 自动发送
  • 域名独立
  • 过期时限
  • 4 KB限制

使用 cookie 完成身份验证的过程:
(cookie 是自动发送的 -> 程序员不需进行操作)

20220726160802

20220726160823

关于 cookie 的安全性:

cookie 不具有安全性

谁捡到你的校园卡都可以使用

浏览器端的 cookie 不能存储用户的重要数据。

提高用户身份认证的安全性

校园卡 + 刷卡认证

如果保安认真看了你是不是卡上的人,甚至然你刷卡验证,这时候就是 cookie 和 session 相结合了

session 的工作原理:

20220726162033

express-session 中间件的使用

// 导入session 中间件
let session = require(' express-session');

// 配置 session 中间件
app.use(sesison({
    secret:'niubi', // 配置任意字符串,负责对 session 进行加密
    resave:false,
    svaUninitialized:true
}))

向 session 中存数据:
通过 req.session 来操作 session。

req.session.user = req.body;
req.session.islogin = true;

从 session 中取数据:

app.get('/api/username',(req,res)=>{
    // 判断用户是否登录
    if(!req.session.islogin){
        return res.send({status:1,msg:'fail'})
    }

    res.send({status:0,msg:'success',username:req.session.user.username})
})

清空 session:

// 退出登录的接口
app.post('/api/logout',(req,res)=>{
    // 清空 session 的信息
    req.session.destory();

    res.send({status:0,msg:'退出登录成功!'})
})

前后端分离

使用 jwt

session 的局限性:
session 认证机制需要配合 cookie 才能够使用,由于 cookie 默认不支持跨域访问,所以需要做很多额外的配置,才能够使用跨域 session 认证。

注意:
使用session还是jwt主要取决于是否跨域。

jwt -> JSON web token

jwt 的工作原理:

加密 + 还原

20220726164608

jwt 的字符串 = header(头部) + payload(有效载荷) + signature(签名)

格式:
header.payload.signature

payload 部分是真正有用的用户信息,其余两部分与安全性有关。

20220726165320

jwt 存储在请求头的 Authorization: Bearer

在 express 中使用 jwt

两个包:
jsonwebtoken -> 生成 jwt字符串
express-jwt-> 将 jwt 字符串还原为 JSON 对象

const jsonwebtoken = require('jsonwebtoken');
const expressJWT = require('express-jwt');

我们需要定义 jwt 的加密密钥

  • 加密
  • 还原
const secretKey = 'ljj^_^'

具体的使用:

// jwt 生成
// 登录接口
// 用户登录成功后,生成 jwt 字符串,通过 token 响应给客户端
app.use('/api/login',function (req,res) {
    //登录失败的代码
    ...
    //登录成功
    res.send({
        status:200,
        msg:'success',
        // sign的单个参数:用户信息,密钥,配置对象(有效期)
        token:jsonwebtoken.sign({username:userInfo.username},secretKey,{expiresIn:'30s'})
    })
})

// jwt 还原
// 使用 unless({path:[/^\/api\//]}) 来指定哪些页面不需要访问权限
app.use(expressJWT{secret:secretKey}.unless({path:[/^\/api\//]}))
// 成功后,req.user即可使用

express 的错误中间件:

app.use(errr,req,res,next) => {
    // token 导致的错误
    if(err.name === 'UnauthorizedError'){
        return res.send({...})
    }

    // 其他原因导致的错误
    res.send({...})
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城南顾北

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值