首先理清cookie和session。因为我的博客有登录功能所以用到了cookie,但是因为cookie并不安全,业内的统一解决方案是引入session
理解Cookie(headers)
cookie是存储在浏览器的一串字符串 (最大5kb) cookie有跨域不共享的特性,浏览器为每个域名分别存储一段域名 cookie的格式如 K1-v1;K2=v2;K3=v3; 因此可以存储结构化数据
每次发送http请求,会将请求域的cookie一起发送给server server端可以修改cookie并返回给浏览器 浏览器(Client)也可以通过javaScrip修改cookie(有限制,可以在server端进行限制)
如下图
浏览器(Client端)操作cookie
以chrome为例
查看cookie
未解析的:network > ALL > headers responseheaders requestheaders
解析后的:Application > Storage > Cookies Name cookie的名字,Value:cookie的值,Domain:cookie生效的域名,path:cookie生效的路径,expires:cookie的有效期,size:cookie的大小
用js修改cookie 在浏览器控制台中,Console中 查看cookies:document.cookie 累加cookies:document.cookie='K2=v1' 并不能修改删除,只能累加
server端操作cookie
查看cookie 修改cookie 两者就可以实现登录验证
解析cookie
//解析cookies
req.cookie = {} //定义一个req.cookies为空值
const cookieStr = req.headers.cookie || ''
cookieStr.split(';').forEach(item => { //通过分号拆分数组,并进行遍历
if(!item) { //如果item的值不存在
return //return结束,return是终止符
}
const arr = item.split('=') //通过等号把K1=V1拆分成数组
const key = arr[0].trim() //key是等号前面那个值
const val = arr[1].trim() //val是等号后面那个值
req.cookie[key] = val //把key的值赋值为val
})
console.log('req.cookie is',req.cookie) // {name:lisi}
操作cookie
res.setHeader('set-Cookie',`userid=${userId};path=/;httpOnly;expires=${getCookieExpires()}`)
//path=/:设置生效路径为根目录
//httpOnly: 设置只允许后端修改
//expires=:设置生效时间期限
. .
理解session
sesion可以弥补cookie的缺陷 单纯cookie的缺陷
会暴露信息(如用户名,登录密码) 非常危险
解决办法:
server端的session存储用户信息,cookie只存储userid来到session中取用 如cookie 》userid, server》username
//设置sesson空对象
const SESSION_DATA= {}
//解析session
let needSetCookie = false //默认判断需要验证
let userId = req.cookie.userid
if(userId){
if(!SESSION_DATA[userId]) {//如果SESSION_DATA没有这个userid就初始化一个对象
SESSION_DATA[userId] = {}
}
} else{
needSetCookie = true
userId= `${Date.now()}_${Math.random()}`
SESSION_DATA[userId] = {}
}
req.session = SESSION_DATA[userId]`
Token
token一种新机制 因为cookie对于每个用户都需要在服务器端新建一个session 然后消耗大 反正很多坏处 token就是把信息保存在用户端 第一次登陆后服务器把用户信息通过特定算法加密生成一个token 然后结合用户信息和生成的信息统一返回给用户 用户存储 下次用户访问带上这个token 然后服务器只是需要把token里面的签名用算法解密,确认token里面的用户信息是否符合。 符合的就返回相应信息 并且继续返回token token过期之后服务器刷新一下啥的就行
大致整理了一下,后续可能还会再丰富修改