一、什么是JWT
JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。
JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。
组成:
Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
Payload : 用来存放实际需要传递的数据
Signature(签名):服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。
密钥一定要保管好,JWT安全的核心在于签名,签名的核心在于密钥。
增强JWT的安全性:
- 使用安全系数高的加密算法。
- 使用成熟的开源库。
- JWT 存放在 localStorage 中而不是 Cookie 中,避免 CSRF 风险。
- 一定不要将隐私信息存放在 Payload 当中。
- Payload 要加入 exp (JWT 的过期时间),永久有效的 JWT 不合理。并且,JWT 的过期时间不易过长
二、JWT身份验证优点
无状态:JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。
有效避免了CSPF攻击:【CSRF(Cross Site Request Forgery) 一般被翻译为 跨站请求伪造,属于网络攻击领域范围】使用 JWT 进行身份验证不需要依赖 Cookie ,因此可以避免 CSRF 攻击。
CSRF 攻击需要依赖 Cookie ,Session 认证中 Cookie 中的 SessionID 是由浏览器发送到服务端的,只要发出请求,Cookie 就会被携带。借助这个特性,即使黑客无法获取你的 SessionID,只要让你误点攻击链接,就可以达到攻击效果。另外,并不是必须点击链接才可以达到攻击效果,很多时候,只要你打开了某个页面,CSRF 攻击就会发生。
适合移动端应用: JWT 可以被客户端存储就能够使用,而且 JWT 还可以跨语言使用。
单点登录友好: JWT 进行认证的话, JWT 被保存在客户端,不会存在cookie跨域问题。
此处补充一个小知识常见的六大web安全问题:
三、JWT请求验证通过后
解析出登录员工id后,如何传递给Service的save方法?
通过ThreadLocal进行传递。
ThreadLocal 并不是一个Thread,而是Thread的局部变量。 ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
常用方法:
- public void set(T value) 设置当前线程的线程局部变量的值
- public T get() 返回当前线程所对应的线程局部变量的值
- public void remove() 移除当前线程的线程局部变量
- public void remove() 移除当前线程的线程局部变量
四、JWT、cookie、session对比
Cookie: 1.Cookie 是在客户端(通常是浏览器)中存储数据的一种机制。它通常被用于在客户端记录用户的身份验证状态、会话信息等。 2.服务器可以通过设置 HTTP 响应头来在客户端存储 Cookie,然后客户端在后续的 HTTP 请求中会自动发送这些 Cookie 给服务器。 3.与 JWT 不同,Cookie 会在每次 HTTP 请求中自动发送给服务器,因此会增加网络流量,并且可能会受到跨站脚本(XSS)攻击的影响。 Session: 1.Session 是服务器端保存的关于用户的状态信息,通常存储在服务器的内存或数据库中。 2.当用户首次访问服务器时,服务器会为其创建一个唯一的会话标识(Session ID),并将该标识存储在 Cookie 中返回给客户端。 3.后续的请求中,客户端会将这个 Session ID 发送给服务器,服务器通过这个 ID 来获取用户的状态信息。 4.相比于 JWT,Session 更容易受到负载均衡和分布式系统的影响,因为会话信息存储在服务器端,需要进行有效的管理和同步。
cookie和session的区别:
1、数据存放位置不同:cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全程度不同:cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、性能使用程度不同:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。
总结:JWT 适合于跨域认证和分布式系统,而 Cookie 和 Session 则更适合于单一域内的身份验证和状态管理。在实际应用中,可以根据具体场景和需求来选择合适的身份验证机制