<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>SIDO</name>
  </author>
  <generator>Hexo</generator>
  <id>https://sido-meet.online/ai/</id>
  <link href="https://sido-meet.online/ai/" rel="alternate"/>
  <link href="https://sido-meet.online/ai/atom.xml" rel="self" type="application/atom+xml"/>
  <subtitle>披露模型、来源和审核状态的 AI 生成内容。</subtitle>
  <title>SIDO MEET · AI 专栏</title>
  <updated>2026-01-03T14:23:56.000Z</updated>
  <entry>
    <author>
      <name>SIDO</name>
    </author>
    <category term="content:ai"/>
    <category term="AI 专栏" scheme="https://sido-meet.online/categories/AI-%E4%B8%93%E6%A0%8F/"/>
    <category term="JWT" scheme="https://sido-meet.online/tags/JWT/"/>
    <category term="安全" scheme="https://sido-meet.online/tags/%E5%AE%89%E5%85%A8/"/>
    <category term="加密算法" scheme="https://sido-meet.online/tags/%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95/"/>
    <content>
      <![CDATA[<h2 id="JWT详解与加密算法分析"><a href="#JWT详解与加密算法分析" class="headerlink" title="JWT详解与加密算法分析"></a>JWT详解与加密算法分析</h2><h2 id="1-什么是JWT"><a href="#1-什么是JWT" class="headerlink" title="1. 什么是JWT"></a>1. 什么是JWT</h2><p>JWT（JSON Web Token）是一种开放标准（RFC 7519），用于在各方之间安全地传输信息。它以简洁、自包含的方式将信息作为JSON对象进行传输，并通过数字签名确保信息的完整性和真实性。</p>
<p>JWT广泛应用于：</p>
<ul>
<li>用户身份认证</li>
<li>API授权</li>
<li>分布式系统间的安全通信</li>
</ul>
<h2 id="2-JWT的结构"><a href="#2-JWT的结构" class="headerlink" title="2. JWT的结构"></a>2. JWT的结构</h2><p>JWT由三部分组成，用点（.）分隔：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Header.Payload.Signature</span><br></pre></td></tr></table></figure>

<h3 id="2-1-实际JWT示例"><a href="#2-1-实际JWT示例" class="headerlink" title="2.1 实际JWT示例"></a>2.1 实际JWT示例</h3><p>下面是一个真实的JWT示例：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyNDI2MjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c</span><br></pre></td></tr></table></figure>

<h3 id="2-2-Header（头部）"><a href="#2-2-Header（头部）" class="headerlink" title="2.2 Header（头部）"></a>2.2 Header（头部）</h3><p>头部包含令牌类型和使用的加密算法信息：</p>
<figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;alg&quot;</span><span class="punctuation">:</span> <span class="string">&quot;HS256&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;typ&quot;</span><span class="punctuation">:</span> <span class="string">&quot;JWT&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>

<ul>
<li><code>alg</code>：指定签名算法，如HS256、RS256等</li>
<li><code>typ</code>：令牌类型，通常为”JWT”</li>
</ul>
<p>头部经过Base64Url编码后形成JWT的第一部分：<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9</code></p>
<h3 id="2-3-Payload（负载）"><a href="#2-3-Payload（负载）" class="headerlink" title="2.3 Payload（负载）"></a>2.3 Payload（负载）</h3><p>负载包含声明（Claims），即要传输的信息：</p>
<figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;sub&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1234567890&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;John Doe&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;iat&quot;</span><span class="punctuation">:</span> <span class="number">1516239022</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;exp&quot;</span><span class="punctuation">:</span> <span class="number">1516242622</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>

<p>声明分为三种类型：</p>
<ul>
<li><strong>注册声明</strong>：预定义的声明，如<code>iss</code>（签发者）、<code>exp</code>（过期时间）、<code>sub</code>（主题）、<code>iat</code>（签发时间）等</li>
<li><strong>公共声明</strong>：自定义声明，应避免与注册声明冲突</li>
<li><strong>私有声明</strong>：各方约定的自定义声明</li>
</ul>
<p>负载同样经过Base64Url编码后形成JWT的第二部分：<code>eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyNDI2MjJ9</code></p>
<h3 id="2-4-Signature（签名）"><a href="#2-4-Signature（签名）" class="headerlink" title="2.4 Signature（签名）"></a>2.4 Signature（签名）</h3><p>签名用于验证令牌的完整性和真实性。生成方式取决于使用的算法：</p>
<p>对于HS256算法：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">HMACSHA256(</span><br><span class="line">  base64UrlEncode(header) + &quot;.&quot; + base64UrlEncode(payload),</span><br><span class="line">  &quot;your-256-bit-secret&quot;</span><br><span class="line">)</span><br></pre></td></tr></table></figure>

<p>签名结果经过Base64Url编码后形成JWT的第三部分：<code>SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c</code></p>
<p><strong>注意</strong>：你可以使用<a href="https://jwt.io/">JWT.io</a>调试器来解码、验证和生成JWT令牌。</p>
<h2 id="3-JWT的工作流程"><a href="#3-JWT的工作流程" class="headerlink" title="3. JWT的工作流程"></a>3. JWT的工作流程</h2><ol>
<li>用户使用凭据（如用户名密码）登录</li>
<li>服务器验证凭据有效性</li>
<li>验证通过后，服务器生成JWT令牌并发送给客户端</li>
<li>客户端将JWT存储在本地（如localStorage或Cookie）</li>
<li>客户端在后续请求中通过HTTP头（通常是<code>Authorization: Bearer &lt;token&gt;</code>）发送JWT</li>
<li>服务器验证JWT的签名和有效性</li>
<li>验证通过后，服务器处理请求并返回响应</li>
</ol>
<h2 id="4-JWT加密算法详解"><a href="#4-JWT加密算法详解" class="headerlink" title="4. JWT加密算法详解"></a>4. JWT加密算法详解</h2><p>JWT支持多种加密算法，主要分为两大类：对称加密算法和非对称加密算法。</p>
<h3 id="4-1-对称加密算法"><a href="#4-1-对称加密算法" class="headerlink" title="4.1 对称加密算法"></a>4.1 对称加密算法</h3><h4 id="HS256-HMAC-SHA256"><a href="#HS256-HMAC-SHA256" class="headerlink" title="HS256 (HMAC-SHA256)"></a>HS256 (HMAC-SHA256)</h4><p>HS256是最常用的JWT签名算法，属于对称加密算法：</p>
<ul>
<li><strong>工作原理</strong>：使用同一个密钥进行签名和验证</li>
<li><strong>优点</strong>：<ul>
<li>实现简单，性能高效</li>
<li>计算速度快，适合高并发场景</li>
</ul>
</li>
<li><strong>缺点</strong>：<ul>
<li>密钥必须在所有使用方之间共享</li>
<li>密钥泄露风险高，任何一方泄露密钥都会导致整个系统不安全</li>
</ul>
</li>
</ul>
<h4 id="HS384-和-HS512"><a href="#HS384-和-HS512" class="headerlink" title="HS384 和 HS512"></a>HS384 和 HS512</h4><p>与HS256类似，只是使用更长的哈希长度（384位和512位），提供更高的安全性，但性能略有下降。</p>
<h3 id="4-2-非对称加密算法"><a href="#4-2-非对称加密算法" class="headerlink" title="4.2 非对称加密算法"></a>4.2 非对称加密算法</h3><h4 id="RS256-RSA-SHA256"><a href="#RS256-RSA-SHA256" class="headerlink" title="RS256 (RSA-SHA256)"></a>RS256 (RSA-SHA256)</h4><p>RS256是基于RSA算法的非对称加密算法：</p>
<ul>
<li><strong>工作原理</strong>：<ul>
<li>使用私钥进行签名</li>
<li>使用公钥进行验证</li>
</ul>
</li>
<li><strong>优点</strong>：<ul>
<li>更高的安全性，私钥只需要在服务器端保存</li>
<li>公钥可以安全地分发给客户端或其他服务</li>
<li>支持密钥轮换，提高系统安全性</li>
</ul>
</li>
<li><strong>缺点</strong>：<ul>
<li>计算复杂度高，性能比HS256低</li>
<li>密钥管理相对复杂</li>
</ul>
</li>
</ul>
<h4 id="RS384-和-RS512"><a href="#RS384-和-RS512" class="headerlink" title="RS384 和 RS512"></a>RS384 和 RS512</h4><p>与RS256类似，使用更长的哈希长度，提供更高的安全性。</p>
<h4 id="ES256-ECDSA-SHA256"><a href="#ES256-ECDSA-SHA256" class="headerlink" title="ES256 (ECDSA-SHA256)"></a>ES256 (ECDSA-SHA256)</h4><p>ES256是基于椭圆曲线加密（ECC）的非对称算法：</p>
<ul>
<li><strong>工作原理</strong>：使用椭圆曲线密钥对进行签名和验证</li>
<li><strong>优点</strong>：<ul>
<li>相同安全性下，密钥长度比RSA短（256位ECC密钥相当于3072位RSA密钥）</li>
<li>计算效率比RSA高</li>
</ul>
</li>
<li><strong>缺点</strong>：<ul>
<li>椭圆曲线算法的实现较为复杂</li>
<li>某些旧系统可能不支持</li>
</ul>
</li>
</ul>
<h4 id="ED25519"><a href="#ED25519" class="headerlink" title="ED25519"></a>ED25519</h4><p>ED25519是基于Curve25519椭圆曲线的现代签名算法：</p>
<ul>
<li><strong>优点</strong>：<ul>
<li>极高的安全性</li>
<li>高性能</li>
<li>密钥生成简单</li>
</ul>
</li>
<li><strong>缺点</strong>：<ul>
<li>支持度相对较低</li>
</ul>
</li>
</ul>
<h2 id="5-算法选择建议"><a href="#5-算法选择建议" class="headerlink" title="5. 算法选择建议"></a>5. 算法选择建议</h2><p>根据不同场景选择合适的算法：</p>
<table>
<thead>
<tr>
<th>场景</th>
<th>推荐算法</th>
<th>理由</th>
</tr>
</thead>
<tbody><tr>
<td>单服务器应用</td>
<td>HS256</td>
<td>实现简单，性能高效</td>
</tr>
<tr>
<td>微服务架构</td>
<td>RS256&#x2F;ES256</td>
<td>安全性高，密钥管理灵活</td>
</tr>
<tr>
<td>移动应用</td>
<td>RS256&#x2F;ES256</td>
<td>私钥安全存储在服务器端</td>
</tr>
<tr>
<td>对性能要求高</td>
<td>HS256&#x2F;ES256</td>
<td>计算速度快</td>
</tr>
<tr>
<td>对安全性要求极高</td>
<td>RS512&#x2F;ES512&#x2F;ED25519</td>
<td>提供最高级别的安全保障</td>
</tr>
</tbody></table>
<h2 id="6-JWT安全最佳实践"><a href="#6-JWT安全最佳实践" class="headerlink" title="6. JWT安全最佳实践"></a>6. JWT安全最佳实践</h2><ol>
<li><strong>使用安全的签名算法</strong>：避免使用HS256以外的对称算法，优先考虑非对称算法</li>
<li><strong>保护密钥安全</strong>：<ul>
<li>对称算法密钥必须严格保密</li>
<li>非对称算法私钥必须安全存储，公钥可以公开</li>
</ul>
</li>
<li><strong>设置合理的过期时间</strong>：<ul>
<li>访问令牌（Access Token）过期时间不宜过长（如15-30分钟）</li>
<li>使用刷新令牌（Refresh Token）获取新的访问令牌</li>
</ul>
</li>
<li><strong>使用HTTPS传输</strong>：确保JWT在传输过程中不被窃取</li>
<li><strong>避免在Payload中存储敏感信息</strong>：Payload默认是Base64Url编码，不是加密，敏感信息应加密后存储</li>
<li><strong>实现令牌撤销机制</strong>：如使用黑名单或状态管理处理令牌撤销场景</li>
<li><strong>定期轮换密钥</strong>：提高系统安全性</li>
</ol>
<h2 id="7-JWT代码示例"><a href="#7-JWT代码示例" class="headerlink" title="7. JWT代码示例"></a>7. JWT代码示例</h2><h3 id="7-1-Node-js示例（使用jsonwebtoken库）"><a href="#7-1-Node-js示例（使用jsonwebtoken库）" class="headerlink" title="7.1 Node.js示例（使用jsonwebtoken库）"></a>7.1 Node.js示例（使用jsonwebtoken库）</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 安装依赖：npm install jsonwebtoken</span></span><br><span class="line"><span class="keyword">const</span> jwt = <span class="built_in">require</span>(<span class="string">&#x27;jsonwebtoken&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 生成JWT令牌</span></span><br><span class="line"><span class="keyword">const</span> secretKey = <span class="string">&#x27;your-256-bit-secret&#x27;</span>;</span><br><span class="line"><span class="keyword">const</span> payload = &#123;</span><br><span class="line">  <span class="attr">sub</span>: <span class="string">&#x27;1234567890&#x27;</span>,</span><br><span class="line">  <span class="attr">name</span>: <span class="string">&#x27;John Doe&#x27;</span>,</span><br><span class="line">  <span class="attr">admin</span>: <span class="literal">true</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> token = jwt.<span class="title function_">sign</span>(payload, secretKey, &#123; <span class="attr">expiresIn</span>: <span class="string">&#x27;1h&#x27;</span> &#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;生成的JWT令牌:&#x27;</span>, token);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 验证JWT令牌</span></span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> decoded = jwt.<span class="title function_">verify</span>(token, secretKey);</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;验证结果:&#x27;</span>, decoded);</span><br><span class="line">  <span class="comment">// 可以在这里进行权限检查等操作</span></span><br><span class="line">  <span class="keyword">if</span> (decoded.<span class="property">admin</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户具有管理员权限&#x27;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;令牌验证失败:&#x27;</span>, error.<span class="property">message</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<h3 id="7-2-Python示例（使用PyJWT库）"><a href="#7-2-Python示例（使用PyJWT库）" class="headerlink" title="7.2 Python示例（使用PyJWT库）"></a>7.2 Python示例（使用PyJWT库）</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装依赖：pip install pyjwt</span></span><br><span class="line"><span class="keyword">import</span> jwt</span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成JWT令牌</span></span><br><span class="line">secret_key = <span class="string">&#x27;your-256-bit-secret&#x27;</span></span><br><span class="line">payload = &#123;</span><br><span class="line">    <span class="string">&#x27;sub&#x27;</span>: <span class="string">&#x27;1234567890&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;name&#x27;</span>: <span class="string">&#x27;John Doe&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;admin&#x27;</span>: <span class="literal">True</span>,</span><br><span class="line">    <span class="string">&#x27;iat&#x27;</span>: datetime.datetime.utcnow(),</span><br><span class="line">    <span class="string">&#x27;exp&#x27;</span>: datetime.datetime.utcnow() + datetime.timedelta(hours=<span class="number">1</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用HS256算法</span></span><br><span class="line">token = jwt.encode(payload, secret_key, algorithm=<span class="string">&#x27;HS256&#x27;</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;生成的JWT令牌:&#x27;</span>, token)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用RS256算法（需要密钥对）</span></span><br><span class="line"><span class="comment"># import rsa</span></span><br><span class="line"><span class="comment"># private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)</span></span><br><span class="line"><span class="comment"># token = jwt.encode(payload, private_key, algorithm=&#x27;RS256&#x27;)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证JWT令牌</span></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    decoded = jwt.decode(token, secret_key, algorithms=[<span class="string">&#x27;HS256&#x27;</span>])</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;验证结果:&#x27;</span>, decoded)</span><br><span class="line">    <span class="keyword">if</span> decoded[<span class="string">&#x27;admin&#x27;</span>]:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;用户具有管理员权限&#x27;</span>)</span><br><span class="line"><span class="keyword">except</span> jwt.ExpiredSignatureError:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;令牌已过期&#x27;</span>)</span><br><span class="line"><span class="keyword">except</span> jwt.InvalidTokenError:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;无效的令牌&#x27;</span>)</span><br></pre></td></tr></table></figure>

<h3 id="7-3-前端使用示例"><a href="#7-3-前端使用示例" class="headerlink" title="7.3 前端使用示例"></a>7.3 前端使用示例</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 登录后保存令牌到localStorage</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">login</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="comment">// 假设从服务器获取到了令牌</span></span><br><span class="line">  <span class="keyword">const</span> token = <span class="string">&#x27;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&#x27;</span>;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&#x27;token&#x27;</span>, token);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 发送请求时携带令牌</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">fetchProtectedResource</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> token = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&#x27;token&#x27;</span>);</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">&#x27;https://api.example.com/protected&#x27;</span>, &#123;</span><br><span class="line">      <span class="attr">headers</span>: &#123;</span><br><span class="line">        <span class="string">&#x27;Authorization&#x27;</span>: <span class="string">`Bearer <span class="subst">$&#123;token&#125;</span>`</span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="keyword">const</span> data = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;受保护资源:&#x27;</span>, data);</span><br><span class="line">  &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;请求失败:&#x27;</span>, error);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<h2 id="8-JWT应用场景示例"><a href="#8-JWT应用场景示例" class="headerlink" title="8. JWT应用场景示例"></a>8. JWT应用场景示例</h2><h3 id="8-1-单页应用（SPA）认证"><a href="#8-1-单页应用（SPA）认证" class="headerlink" title="8.1 单页应用（SPA）认证"></a>8.1 单页应用（SPA）认证</h3><ol>
<li>用户通过用户名密码登录</li>
<li>服务器验证成功后返回JWT令牌</li>
<li>前端将令牌存储在localStorage中</li>
<li>每次请求API时，在Authorization头中携带令牌</li>
<li>服务器验证令牌有效性，决定是否响应请求</li>
</ol>
<h3 id="8-2-微服务架构中的授权"><a href="#8-2-微服务架构中的授权" class="headerlink" title="8.2 微服务架构中的授权"></a>8.2 微服务架构中的授权</h3><ol>
<li>API网关接收用户请求</li>
<li>网关验证JWT令牌的有效性</li>
<li>验证通过后，将请求转发到相应的微服务</li>
<li>微服务可以直接使用JWT中的信息，无需再次查询数据库</li>
<li>不同微服务可以共享相同的JWT验证逻辑</li>
</ol>
<h3 id="8-3-移动应用认证"><a href="#8-3-移动应用认证" class="headerlink" title="8.3 移动应用认证"></a>8.3 移动应用认证</h3><ol>
<li>用户在移动应用中登录</li>
<li>服务器返回JWT令牌和刷新令牌</li>
<li>应用将令牌存储在安全的位置（如Keychain&#x2F;iOS或Keystore&#x2F;Android）</li>
<li>每次API请求携带JWT令牌</li>
<li>令牌过期时，使用刷新令牌获取新的访问令牌</li>
</ol>
<h2 id="9-JWT与传统Session的对比"><a href="#9-JWT与传统Session的对比" class="headerlink" title="9. JWT与传统Session的对比"></a>9. JWT与传统Session的对比</h2><table>
<thead>
<tr>
<th>特性</th>
<th>JWT</th>
<th>Session</th>
</tr>
</thead>
<tbody><tr>
<td>状态管理</td>
<td>无状态</td>
<td>有状态</td>
</tr>
<tr>
<td>服务器存储</td>
<td>不需要</td>
<td>需要存储会话信息</td>
</tr>
<tr>
<td>扩展性</td>
<td>易于水平扩展</td>
<td>需要共享会话存储</td>
</tr>
<tr>
<td>跨域支持</td>
<td>良好</td>
<td>需要额外配置</td>
</tr>
<tr>
<td>性能</td>
<td>高（减少数据库查询）</td>
<td>中等（需要查询会话）</td>
</tr>
<tr>
<td>安全性</td>
<td>依赖于签名算法和密钥管理</td>
<td>依赖于Cookie安全设置</td>
</tr>
</tbody></table>
<h2 id="10-总结"><a href="#10-总结" class="headerlink" title="10. 总结"></a>10. 总结</h2><p>JWT是一种灵活、高效的认证和授权机制，通过选择合适的加密算法和遵循安全最佳实践，可以构建安全可靠的身份验证系统。在实际应用中，应根据系统架构、安全需求和性能要求选择合适的JWT实现方案。</p>
<h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul>
<li><a href="https://datatracker.ietf.org/doc/html/rfc7519">JWT官方规范</a></li>
<li><a href="https://blog.csdn.net/gitblog_00465/article/details/153308845">从安全到性能:HS256与RS256在tymon&#x2F;jwt-auth中的终极抉择</a></li>
<li><a href="https://blog.csdn.net/2201_75798391/article/details/145949468">JWT 签名算法的选择:HS256、RS256、ES256 和 ED25519 的对比与应用</a></li>
<li><a href="https://blog.csdn.net/frank110503/article/details/146455829">JSON Web Token (JWT) 完整指南</a></li>
</ul>]]>
    </content>
    <id>https://sido-meet.online/2026/01/03/JWT%E8%AF%A6%E8%A7%A3%E4%B8%8E%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90/</id>
    <link href="https://sido-meet.online/2026/01/03/JWT%E8%AF%A6%E8%A7%A3%E4%B8%8E%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90/"/>
    <published>2026-01-03T14:23:56.000Z</published>
    <summary>系统介绍 JWT 的结构、签名验证流程，以及 HMAC、RSA、ECDSA 等常用算法的差异与安全边界。</summary>
    <title>JWT详解与加密算法分析</title>
    <updated>2026-01-03T14:23:56.000Z</updated>
  </entry>
</feed>
