首先理清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过期之后服务器刷新一下啥的就行

大致整理了一下,后续可能还会再丰富修改