JWT的简单介绍

 

由于HTTP协议是无状态的协议,因此用户登陆后保持登陆状态就是第一个需要解决的问题

在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式。当用户登录成功,服务端会保存一个session,会给客户端一个sessionId客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId。

cookie+session这种模式通常是保存在内存中,而且服务从单服务到多服务会面临的session共享问题,随着用户量的增多,开销就会越大。而JWT不是这样的,只需要服务端生成token,客户端保存这个token,每次请求携带这个token,服务端认证解析就可

 

1. JWT的构成

由,header(头部),payload(载荷),signature(签证)

header(头部)
    jwt的头部承载两部分信息:

           {'  typ': 'JWT',     'alg': 'HS256'}

payload(载荷)
                         iss: jwt签发者
  sub: jwt所面向的用户
  aud: 接收jwt的一方
  exp: jwt的过期时间,这个过期时间必须要大于签发时间
  nbf: 定义在什么时间之前,该jwt都是不可用的.
  iat: jwt的签发时间
  jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

signature(签证)
           
header (base64后的)
        payload (base64后的)

         secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

 

JWT的流程:

 

            ①首先用户通过用户名密码向认证服务器发起请求 
            ②认证服务器核实用户身份之后,生成一个Token返回到客户端,这个生成过程如下:首先构造称为header的JSON对象:{"typ":"JWT",

 

                     "alg":"HS256}

这个JSON包含两个字段,typ表示Token的类型,一般情况下为JWT,alg表示签名算法,这里我们使用HMACSHA256算法。

     接着是payload部分,认证服务器验证密码后找到用户的ID,将其放入payload,并且给定一个过期时间:接着我们把header和payload分别使用base64算法编码,然后用点号连接起来,并且使用私钥和HS256算法进行签名。

通过以上的过程,认证服务器将jwt返回的客户端,格式如下:aaaa.bbbb.cccc

          1.JWT可以放在那里?

           2.JWT的适用场景

 
    1.JWT可以放在那里?
            1.html5存储:localStorage or sessionStorage (Web Storage)
           2.放置cookies中
            相同对比:
相同点:都是无状态的,因为api所需要的验证信息都在token中<br>
不同点:1.前者可使用跨站点脚本(XSS)进行攻击,cross-site scripting (XSS) attacks。所以,Web存储在传输过程中不执行任何安全标准

2.Cookie与HttpOnly cookie标志一起使用时,不能通过JavaScript访问,并且不受XSS影响。但是传统的cookies不符合RESTful最佳实践,因为需要服务器存储。cookies+JWT不需要将状态存储在服务器上

JWT的适用场景

           由于Token的信息会暴露 因此,在JWT中,不应该在载荷里面加入任何敏感的数据

像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。

因此,JWT更适合用于一次性操作和做RESTful API无状态的身份认证。

 

 

 

1。jwt token防止泄露

            使用 https 加密你的应用,返回 jwt 给客户端时设置 httpOnly=true 并且使用 cookie 而不是 LocalStorage 存储 jwt,这样可以防止 XSS 攻击和 CSRF 攻击 

2.为什么不推荐使用 jwt 做单点登录+会话管

续签问题:

传统的 cookie 续签方案一般都是框架自带的,session 有效期 30 分钟,30 分钟内如果有访问,session 有效期被刷新至 30 分钟。而 jwt 本身的 payload 之中也有一个 exp 过期时间参数,来代表一个 jwt 的时效性,而 jwt 想延期这个 exp 就有点身不由己了,因为 payload 是参与签名的,一旦过期时间被修改,整个 jwt 串就变了,jwt 的特性天然不支持续签

如果一定要使用 jwt 做会话管理(payload 中存储会话信息),也不是没有解决方案

 

1.每次请求刷新 jwt 

2.只要快要过期的时候刷新 jwt

 

 

JWT的优劣势

  https://blog.youkuaiyun.com/qq_28165595/article/details/80214994

           安全传递

   http://blog.leapoahead.com/2015/09/06/understanding-jwt/

           基于JWT的Token验证

   https://blog.youkuaiyun.com/weixin_38568779/article/details/76833848

 

<think>嗯,用户之前问过Java毕业设计涉及的技术,现在接着问JWT的详细介绍。我需要先理解JWT是什么,以及它在Java项目中的应用场景。用户可能是在做毕业设计时遇到了身份验证的问题,或者想了解如何安全地管理用户会话。 JWT的全称是JSON Web Token,应该先解释它的基本概念,结构组成,比如header、payload、signature。然后要说明它的工作原理,用户可能想知道为什么使用JWT而不是传统的session方式,所以需要比较两者的优缺点,比如无状态、跨域支持这些。 用户可能关心JWT的安全性,所以需要提到如何防止被篡改,比如签名机制,以及存储时需要注意的问题,比如不要放在localStorage中,可能涉及XSS和CSRF攻击的防范。另外,JWT的过期时间设置也很重要,避免令牌被长期滥用。 在Java中使用JWT的话,可能需要推荐一些库,比如jjwt,然后给出一个简单的示例代码,说明如何生成和验证Token。这部分需要确保代码正确,并且符合Java的常见实践,比如使用Spring Security整合。 还要考虑用户可能的误区,比如JWT的存储位置,是否需要服务器端保存,以及注销和续签的问题。这些都是实际开发中常见的问题,需要详细解释解决方案,比如黑名单或者使用refresh token机制。 最后,结合之前用户的问题,JWT通常是毕业设计中实现用户认证的一部分,可以联系到之前提到的技术栈,比如Spring Boot、Spring Security,以及Redis用来处理黑名单。这样帮助用户将JWT整合到他们的项目架构中,确保他们理解如何在实际项目中应用。</think>以下是对JWT的详细介绍,从原理到应用全面解析: --- ### 一、JWT基础概念 **JWT(JSON Web Token)** 是一种开放标准(RFC 7519),用于在各方之间安全传输JSON格式的信息。主要应用场景: - 身份验证(最常见的用途) - 安全信息交换 - 无状态API授权 ### 二、JWT结构解析 一个标准JWT由三部分组成,格式为: $$ \text{Header.Payload.Signature} $$ 例如: ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` #### 1. Header(头部) - 声明令牌类型和签名算法 - Base64Url编码后的JSON ```json { "alg": "HS256", // 签名算法(如HS256/RSA) "typ": "JWT" // 令牌类型 } ``` #### 2. Payload(载荷) - 包含声明(claims)的JSON对象 - 标准声明(建议但不强制使用): ```json { "sub": "1234567890", // 主题(用户ID) "name": "John Doe", // 自定义声明 "iat": 1516239022, // 签发时间(时间戳) "exp": 1516239122 // 过期时间 } ``` - **三类声明**: - Registered claims:预定义标准字段(如iss, exp, sub等) - Public claims:公开定义的字段 - Private claims:双方协商的自定义字段 #### 3. Signature(签名) - 防止数据篡改的核心安全机制 - 计算公式: $$ \text{签名} = \text{HMAC\_SHA256}( \text{base64UrlEncode(header)} + "." + \text{base64UrlEncode(payload)}, \text{secretKey} ) $$ ### 三、JWT工作流程 ```mermaid sequenceDiagram 用户->>客户端: 提交登录凭证 客户端->>服务器: 发送用户名/密码 服务器->>服务器: 验证凭证有效性 服务器->>客户端: 返回签名的JWT 客户端->>服务器: 后续请求携带JWTHeader中) 服务器->>服务器: 验证签名+检查过期时间 服务器->>客户端: 返回请求数据 ``` ### 四、JWT核心特性 #### 优点: 1. **无状态**:服务端无需存储会话信息 2. **跨域支持**:适合微服务和分布式系统 3. **自包含**:payload可携带用户基本信息 4. **防篡改**:签名机制保证数据完整性 #### 缺点: 1. **无法废止**:签发后有效期内始终有效(需配合黑名单机制) 2. **payload不宜过大**:增加网络传输负担 3. **密钥管理**:密钥泄露会导致系统安全崩溃 ### 五、Java中的JWT实现 #### 常用库: - **jjwt**(Java JWT):最流行的实现 - **auth0/java-jwt**:功能全面的开源库 - **Nimbus JOSE+JWT**:符合JOSE规范 #### Spring Boot整合示例(使用jjwt): ```java // 生成Token public String createToken(String username) { return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + 3600_000)) // 1小时 .signWith(SignatureAlgorithm.HS512, "yourSecretKey") .compact(); } // 验证Token public Claims parseToken(String token) { return Jwts.parser() .setSigningKey("yourSecretKey") .parseClaimsJws(token) .getBody(); } ``` ### 六、安全实践建议 1. **密钥管理**: - 使用至少256位的强密钥 - 密钥存储在环境变量/配置中心,避免硬编码 2. **传输安全**: - 必须通过HTTPS传输 - 建议存放在HttpOnly Cookie中(防XSS攻击) 3. **时效控制**: - 设置合理过期时间(通常15分钟-2小时) - 使用refresh token机制续期 4. **敏感数据**: - 不要在payload中存储密码等敏感信息 - 避免暴露用户隐私数据 ### 七、JWT vs Session 对比 | 特性 | JWT | Session | |---------------------|------------------------------|-----------------------| | 存储位置 | 客户端 | 服务端 | | 扩展性 | 天然支持分布式系统 | 需要会话共享方案 | | 安全性 | 依赖签名算法和密钥管理 | 依赖Cookie安全配置 | | 性能影响 | 需解析签名(计算开销) | 需查询会话存储 | | 失效机制 | 需结合黑名单或短过期时间 | 直接删除会话即可 | ### 八、常见问题解决方案 1. **注销问题**: - 方案1:使用Token黑名单(Redis存储失效Token) - 方案2:设置较短过期时间 + 使用refresh token 2. **密钥轮换**: - 定期更新签名密钥 - 新旧密钥并存过渡期 3. **跨域共享**: - 配置CORS策略 - 确保Domain属性正确设置 --- **实际应用建议**:在毕业设计中,推荐将JWT与Spring Security结合使用,配合Redis实现黑名单管理。典型流程可参考: $$ \text{用户登录} \rightarrow \text{签发JWT} \rightarrow \text{API鉴权} \rightarrow \text{权限控制} $$ 注意控制Payload体积,建议只存储用户ID和必要角色信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值