JWT令牌详解

简介: JWT令牌详解

一、什么是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 则更适合于单一域内的身份验证和状态管理。在实际应用中,可以根据具体场景和需求来选择合适的身份验证机制

相关文章
|
1月前
|
JSON 安全 程序员
[JavaWeb]——JWT令牌技术,如何从获取JWT令牌
[JavaWeb]——JWT令牌技术,如何从获取JWT令牌
|
3天前
|
JSON 前端开发 数据格式
关于JWT令牌和过滤器以及拦截器的实现流程
JWT令牌用于验证用户请求合法性,登录时通过Filter或Interceptor校验账号密码,生成JWT并返回给前端保存。请求时,后端通过解析令牌检查其完整性、时效性和合法性。Filter在请求处理前检查是否携带JWT,Interceptor的preHandle方法同样用于此目的。两者选择其一即可,拦截器配置更精确但稍复杂。
26 0
|
1月前
|
存储 JSON 算法
SpringBoot之JWT令牌校验
SpringBoot之JWT令牌校验
51 2
|
1月前
|
JSON 前端开发 Java
|
1月前
|
JSON 前端开发 Java
JWT解密:探秘令牌魔法与Java的完美交互
JWT解密:探秘令牌魔法与Java的完美交互
32 0
JWT解密:探秘令牌魔法与Java的完美交互
|
1月前
|
前端开发 Java Spring
SpringBoot通过拦截器和JWT令牌实现登录验证
该文介绍了JWT工具类、匿名访问注解、JWT验证拦截器的实现以及拦截器注册。使用`java-jwt`库生成和验证JWT,JwtUtil类包含generateToken和verifyToken方法。自定义注解`@AllowAnon`允许接口匿名访问。JwtInterceptor在Spring MVC中拦截请求,检查JWT令牌有效性。InterceptorConfig配置拦截器,注册并设定拦截与排除规则。UserController示例展示了注册、登录(允许匿名)和需要验证的用户详情接口。
347 1
|
1月前
|
前端开发 数据安全/隐私保护
JWT令牌
JWT令牌
20 0
|
1月前
|
JSON 安全 Java
JWT令牌技术
JSON Web Token (JWT) 是一种安全的、自包含的信息传输格式,常用于身份验证和信息交换。它由Header、Payload和Signature三部分组成,其中Signature用于验证消息完整性和发送者身份。JWT包含用户信息,服务器登录后发送给客户端,客户端使用JWT证明身份访问受保护资源。在Java项目中,可以使用`java-jwt`库进行JWT的生成和解析。要开始使用JWT,需在Maven或Gradle中添加相关依赖,并实现生成和解析JWT的方法。此外,文中还提供了一个简单的Java Web应用示例,展示如何在用户登录和访问受保护资源时使用JWT。
64 0
|
1月前
JWT令牌的使用
JWT令牌的使用
61 0
|
1月前
|
存储 JSON 算法
登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)
登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)