一、cookie的理解
通过浏览器输入用户名和密码发送请求到服务器,后端验证通过后返回响应,并生成cookie返回通过设置Set-Cookie
响应头返回客户端,客户端将收到的cookie存储,再次发起请求的时候携带cookie,服务器就会判断请求者的身份
二、cookie | session | token
1、cookie
cookie不是缓存,而是由服务器产生,保存在客户端的键值对信息
分类:
- 会话级cookie:保存在内存中,浏览器关闭会自动失效
- 持久化cookie:持久化储存在硬盘中,只有失效时间到了才会自动失效
鉴权步骤:
- 客户端第一次访问服务器的时候会生成cookie,通过响应头的
Set-Cookie
返回客户端 -
客户端后续访问服务器时,请求头中都会通过
cookie
将本地的cookie信息传递到服务器
cookie-parser中间件用来对cookie进行解析
// 导入express
const express=require('express')
// 导入cookie中间件
const cookieParser = require('cookie-parser')
const app = express()
// 使用cookie-parser解析客户端传入的cookie 加密解密
app.use(cookieParser('aaa')) //secret
// 向客户端发送cookie
app.get('/send',(req,res)=>{
res.cookie('name','nihao',{maxAge:60*1000,signed:true})
res.send('向客户端发送cookie')
})
// 接收服务器端传入的cookie
app.get('/receive',(req,res)=>{
// cookies 是保存前面所有的cookie
res.send('接收到的cookie-->'+req.signedCookies.name)
})
app.listen( 3000,()=>{
console.log(`serve running at http://localhost:3000`)
})
- 初始化时,传入
secret(参数)
作为签名的秘钥。 - 设置cookie时,将
signed
设置为true
,表示对cookie进行签名。 - 获取cookie时,可以同时通过
req.cookies
,也可以通过req.signedCookies
获取。
2、session
相比于保存在客户端的Cookie,Session将用户交互信息保存在了服务器端,使得同一个客户端每次和服务端交互时,不需要每次都传回所有的Cookie值,而是只要传回一个ID,这个ID是客户端第一次访问服务器的时候生成的,而且每个客户端是唯一的。这样就实现了一个ID就能在服务器取得所有的用户交互信息。
session称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当访问浏览器请求http地址时,将传递到web服务器上并与访问信息进行匹配, 当关闭网站时就表示会话已经结束,网站无法访问该信息了,所以它无法保存永久数据
node中使用session
npm install express-session
let express = require('express')
let session = require('express-session')
let app = express()
app.use(session({
secret:'love',
resave:false,
saveUninitialized:true,
cookie:{
maxAge:1000 * 30
}
}))
// 设置session
router.get('/set',function(req,res,next){
req.session.username='zhangsan'
res.send({ code:0 })
})
// 获取session,如果没有获取到,就应该跳转到登录页面
router.get('/get',function(req,res,next){
let username = req.session.username
res.send({ username })
})
代码 | 操作 |
---|---|
req.session.destroy(err=>{}) | 销毁session |
req.session.username='zhangsan' | 设置session |
req.session.username | 获取session |
req.session.cookie.maxAge=1000 | 重新设置过期时间 |
3、token
token和cookie一样都是首次登陆时,由服务器下发,都有交互时进行验证的功能
token存在哪儿都行,localstorage,sessionStorage或者cookie
- Token完全由应用管理,所以它可以避开同源策略
- Token可以避免CSRF攻击
- Token可以是无状态的,可以在多个服务间共享
4、区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie 不是很安全,考虑到安全应当使用 session。
3、单个cookie不能超过 4K,很多浏览器限制一个站点最多保存20个cookie
三、缺点
因为cookie是直接保存在客户端的,用户可以直接修改cookie中的值,这就导致cookie可能出现被恶意篡改的风险,所以一般的cookie都是经过加密的。
但是签名也无法直接保证数据的安全性,因为原始值相同的情况下签名也相同
所以最好的方案就是session和cookie配置使用,根据sessionID将数据存储在后端,通过cookie将sessionID返回给客户端,cookie中就不存储敏感数据
文章评论