前后端鉴权之session-cookie

前后端鉴权深入理解:Cookie、Session与Node.js实现
本文介绍了Cookie和Session的概念及其在前后端鉴权中的作用。Cookie是存储在客户端的键值对,用于传递信息,而Session是服务器端存储用户状态的会话对象。Session信息通常通过Cookie中的sessionId来引用。在Node.js中,可以使用express-session中间件方便地处理Cookie和Session。然而,Cookie安全性较弱,易受CSRF攻击,且跨域受限;Session虽存储在服务端,但面临分布式环境下session共享的问题。

前后端鉴权之session-cookie

什么是Cookie?

Cookie 就是访问者在访问网站后留下的一个信息片段。它存储在客户端(通常来说是浏览器)。你可以把cookie当作一个map,里边是键值对,每个键值对有过期时间路径脚本可否访问等描述信息;描述信息存储在客户端,客户端请求时,默认会带上cookie的名称和值,不会带描述信息,通过http请求报文header中的cookie项进行传输;服务器响应时,可以设置cookie信息,就在http响应报文的headerSet-Cookie项。

关于Cookie的详细了解请参考——一文了解cookie

什么是Session?

客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMapSession 弥补了 HTTP 无状态特性,服务器可以利用 Session 存储客户端在同一个会话期间的一些操作记录。

sessioncookies 是有联系的,session 就是服务端在客户端 cookies 种下的session_id, 服务端保存session_id所对应的当前用户所有的状态信息。每次客户端请求服务端都带上cookies中的session_id, 服务端判断是否有具体的用户信息,如果没有就去调整登录。

Session 的存储方式

服务端只是给 cookie 一个 sessionId,而 session 的具体内容(可能包含用户信息、session 状态等),要自己存一下。存储的方式有几种:

  • Redis(推荐):内存型数据库,redis中文官方网站。以 key-value 的形式存,正合 sessionId-sessionData 的场景;且访问快。
  • 内存:直接放到变量里。一旦服务重启就没了
  • 数据库:普通数据库。性能不高。

node.js 下的 session 处理

服务端要实现对 cookiesession 的存取,实现起来要做的事还是很多的。在npm中,已经有封装好的中间件,比如 express-session - npm。它主要实现了:

  • 封装了对cookie的读写操作,并提供配置项配置字段加密方式过期时间等。
  • 封装了对session的存取操作,并提供配置项配置**session存储方式(内存/redis)**、存储规则等。
  • req提供了session属性,控制属性的set/get并响应到cookiesession存取上,并给req.session提供了一些方法。

简单实现

// server.js
const express = require('express')
const cookieParser = require('cookie-parser')
// 自动操作 cookie
const session = require('express-session')

// 创建服务器应用程序
const app = express()

// 公开指定目录
app.use('/public/', express.static('./public/'))
app.use(cookieParser())
app.use(session({ // 配置参数
  secret: 'xiaan', // 加密口令
  resave: true, // 重新储存,每一次 session 修改的时候都会从重新存储
  saveUninitialized: false // 默认 true, 未初始化的时候需不需要存储内容
}))

//当服务器收到 get 请求 / 的时候, 执行回调处理函数
app.get('/index', (req, res) => {
  console.log(req.session)
  // 判断是否登录,如果未登录则重定向到登录
  if (req.session.name !== '夏安') return res.redirect('/login')
  res.send('我已经登录') // 中文框架会自动解析字符串编码格式
})

app.get('/login', function (req, res) {
  req.session.name = '夏安'
  res.send('请先登录')
})

app.listen(3000, () => {
  console.log("http://localhost:3000");
})

缺点

  • cookies安全性不好,攻击者可以通过获取本地cookies进行欺骗或者利用cookies进行CSRF攻击。
  • cookies在多个域名下,会存在跨域问题
  • session的信息是保存在服务端上面的,当我们node.jsstke部署多台机器的时候,需要解决共享session,所以引出来session持久化问题,所以session不支持分布式架构,无法支持横向扩展,只能通过数据库来保存会话数据实现共享。如果持久层失败会出现认证失败。

参考:

  • https://juejin.cn/post/6898630134530752520#heading-9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夏安   

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

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

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

打赏作者

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

抵扣说明:

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

余额充值