【WEB安全】session 与 token 相关知识点

2022年05月14日 阅读数:3
这篇文章主要向大家介绍【WEB安全】session 与 token 相关知识点,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。



Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截前端

 知识点笔记
web


session

许多语言在网络编程模块都会实现会话机制,即 session。利用 session,咱们能够管理用户状态,好比控制会话存在时间,在会话中保存属性等。其做用方式一般以下:redis

  • 服务器接收到第一个请求时,生成 session 对象,并经过响应头告诉客户端在 cookie 中放入 sessionId
  • 客户端以后发送请求时,会带上包含 sessionId 的 cookie
  • 服务器经过 sessionId 获取 session ,进而获得当前用户的状态(是否登陆)等信息

也就是说,客户端只须要在登陆的时候发送一次用户名密码,此后只须要在发送请求时带上 sessionId,服务器就能够验证用户是否登陆了。算法

session 存储在内存中,在用户量较少时访问效率较高,但若是一个服务器保存了几十几百万个 session 就十分难顶了。同时因为同一用户的屡次请求须要访问到同一服务器,不能简单作集群,须要经过一些策略(session sticky)来扩展,比较麻烦。数据库

以前见过有的人把 sessionId 持久化到数据库里,只存个 id,大头还在内存里,这个操做我是看不懂的。。。编程

- token

虽然 session 可以比较全面地管理用户状态,但这种方式毕竟占用了较多服务器资源,因此有人想出了一种无需在服务器端保存用户状态(称为 “无状态”)的方案,即便用 token(令牌)来作验证。安全

对于 token 的理解,比较常见的误区是:服务器

  • 生成方面,使用随机算法生成的字符串、设备 mac 地址甚至 sessionId 做为 token。虽然从字面意思上讲这些也算是“令牌”,可是毫无心义。这是真的“没有状态”了,对于状态的控制甚至须要用 session 完成,那只用 session 很差吗?
  • 验证方面,把 token 存储在 session 或数据库中,比对前端传来的 token 与存储的 token 是否一致。鬼鬼,一样的骚操做。更骚的是为了提升比对效率把 token 存储在 redis 中,你们一看哇偶好高端好有道理,就直接采用这种方法了,甚至都懒得想 token 究竟是个什么。。

简单来讲,一个真正的 token 自己是携带了一些信息的,好比用户 id、过时时间等,这些信息经过签名算法防止伪造,也可使用加密算法进一步提升安全性,但通常没有人会在 token 里存储密码,因此不加密也无所谓,反正被截获告终果都同样。(通常会用 base64 编个码,方便传输)cookie

在 web 领域最多见的 token 解决方案是 JWT(JSON Web Token),其具体实现能够参照官方文档,这里再也不赘述。网络

token 的安全性相似 session 方案,与明文密码的差别主要在于过时时间。其做用流程也与 session 相似:

  • 用户使用用户名密码登陆,服务器验证经过后,根据用户名(或用户 id 等),按照预先设置的算法生成 token,其中也能够封装其它信息,并将 token 返回给客户端(能够设置到客户端的 cookie 中,也能够做为 response body)
  • 客户端接收到 token,并在以后发送请求时带上它(利用 cookie、做为请求头或做为参数都可)
  • 服务器对 token 进行解密、验证

token 的优点是无需服务器存储!!!