本篇文章会主要讲解一下token以及session的验证过程,以及cookie的安全问题,以及在实际开发中如何使用,其实这算是老生常谈了,但是我也是吧这篇文章写出来做一个梳理,总结吧,希望你们也能从这篇文章中获益。
一、session验证过程
客户端向服务端发送请求(携带相关数据),服务端把相应的数据存储在服务端中,并给客户端返回一个sessionid,当下一次用户再次请求的时候,会在cookie中携带sessionid,服务端验证进行校验,辨别用户并验证sessionid是否过期,如果没过期可以直接把用户之前存储在服务端的数据拿出来。
弊端:1.因为大量数据存储在服务器端,造成服务器端压力过大
2.由于session传递,需要依赖于cookie,cookie有不安全性(后面会简单介绍一下cookie的不安全性),且对一些非浏览器的客户端以及移动端并不适用
3.浏览器可以禁用cookie,这样就没有办法传递session了
二、cookie的不安全性
1.存储在浏览器端的cookie易被脚本获取
2.存在cookie欺骗,当获取到你cookie中的信息的时候,其实并不需要对cookie中的信息进行解密,只需要正常提交给服务器就可以,服务器会自动识别
解决办法:给cookie一个合理的有效期
HttpOnly:true防止XSS攻击
key使用uuid
https协议比http协议更加安全
三、token的验证过程(token作用是一个令牌)
用户向服务端发送用户名和密码,服务器验证用户名和密码,成功后返回一个token给客户端,存在cookie或者localStorage里,每次请求把token携带过去,服务端收到请求,验证token,如果一致,返回客户端请求的数据
四、JWT
jwt的本质是字符串,包含header,有效载荷(payload),签名(signature)
优点:数据量小,速度比较快
不需要再服务端保存信息,不依赖于cookie
对单点登录很友好
五、实际开发过程中主要过程
1.登陆后,通过uuid生成一个token,将该token作为key的一部分,作为value存储数据库中,并设置过期时间。
2.将token作为jwt的payload生成字符串发挥前端
3.前端请求携带jwt字符串
4.后端定义一个拦截器,每次收到请求时都先查看jwt中的token