token简介
使用token之前: 在传统的web中,由于HTTP协议是无状态性的,它不会记住有哪些用户登录过,所以这时候人们用一个会话标识,即session id来区分每个访问。
浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应,tomcat生成的sessionid叫做jsessionid。这个session id是通过算法生成的随机数(tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid)客户端只保存sessionid到cookie中,而不会保存session,session保存在服务器内存中(当然也可以存在数据库中,但这样不可避免要承担读取数据库的消耗)。
但这就带来了许多问题
- 随着访问量上升,因为服务器要保存所有访问的session,势必会带来性能上的问题。
- 如果把session都存在一台服务器中,在多服务器下的集群场景时,就会造成刚刚在服务器A访问完,但新的请求被转发到服务器B,而服务器B是没有存他的session id的
- 用户在访问时很容易受到CSRF(跨站请求伪造)的攻击
CSRF(跨站请求伪造):即攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、虚拟货币转账等。面对这些问题,token就出世了。
token的用法: token是通过对用户的信息进行加密处理获得的,一般放在请求头,在下一次请求时我们可以通过对比两次的 token 是否一致来判断是否是 CSRF 的伪造请求。
由于token是在请求头的,而不是像session id存在cookie中(在cookie中的话攻击者利用你的名义发请求,网站还是只验证你本地cookie的session id是否匹配,所以攻击者就能成功攻击),当攻击者想要利用你的身份发恶意请求时,由于他无法得知你请求头的token信息,所以无法伪造合法的请求。(相关如何预防csrf攻击)
【计算机网络 网络安全------token】而在分布式的情况下,由于我们的服务器远远不止一台,每一次请求通过负载均衡服务器调度后,往往会访问到不同的服务器,这样就不能访问到之前的 Session数据,因此在分布式集群中需要一个公共的存储空间。
而使用 Session 存储、读取、校验 token 会有较大的复杂度与性能问题,所以一般通过对使用UserID、时间戳和随机数加密获得 token,而不是随机生成。
当请求来时只需要对其在进行一次计算就可以获得 token 了。这样就解除了服务端的负担,因为服务端现在要做的只是再生成 token,然后与请求头的进行比较而已
相关推荐:
- 彻底理解cookie,session,token
https://www.cnblogs.com/moyand/p/9047978.html - shiro使用(使用token预热,为什么要使用token)
https://blog.csdn.net/dghkgjlh/article/details/89820043
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)