浏览器与服务端持久化通信的方式
Cookie
Cookie就是一些数据,用于存储服务器返回给客服端的信息,客户端进行保存。在下一次访问该网站时,客户端会将保存的cookie一同发给服务器,服务器再利用cookie进行一些操作。利用cookie我们就可以实现自动登录,保存游览历史,身份验证等功能。
Session
Set-Cookie: session=xxx
存在cookie中,来自服务端的身份认证id,服务端通过这个id查找信息,数据存在服务端。
- 数据存储在服务端,安全:white_check_mark:
- 容量大:white_check_mark:
- 占用服务器资源:x:
- 分布式集群需要统一session,redis是一个解决方案:x:
- 跨域问题:x:
token
JWT (json web token) 在网络和应用之间安全传递信息的开放标准。用于身份验证和非敏感数据的传递,不需要服务端存储数据。
头部.载荷.待服务端检验部分
默认sha256对称加密,密钥在服务器端,也可选用非对称加密。
公钥加密的只能用私钥解密,私钥签发的签名只能公钥验证
具体实现:
-
JWS json web signature 内容做签名确保不被篡改
-
JWE json web encryption 对内容本身做加密,更安全
使用场景:
- 用户登录身份验证
- 密码重置,服务器生成包含用户信息的JWT并组成一个链接发给用户邮箱
补充:基于api key的认证方式:客户端(应用程序后端)使用私钥加密生成签名,加上公钥一起发给api提供方,api提供方用公钥验证签名
JWT | cookie | api key | |
---|---|---|---|
有状态 | 有 | 无 | 无 |
场景 | 前后端,后端之间 | 前后端 | 后端之间 |
可撤销性 | 差 | 好 | 好 |
生成方式 | 认证通过后生成 | 认证通过后生成 | 预先分配 |
缺点:
- 无法真正logout,有了jwt后端就不去修改数据库信息使得用户logout了,解决方法是退出时主动注销token
- 用户信息无法同步,假设后端数据库里用户信息已经改变,前端发的jwt后端还是直接信任的。解决方法是用户关联信息变化时,可以用soket通知前端更新,或者对用户信息做一个版本控制,验证信息是只判断版号,如果版号异常,就在响应的响应头或附加载荷离添加新的信息
- token泄漏无法立刻无效化 解决方法是:后端不能完全信任前端的token 给token加上有效期和自动续签程序,在接近过期时间的时候在响应头提供新的token (后端也要对token做备份,不存在备份的token统一视为已过期)这一点应该不用考虑,jwt的防止篡改
()