<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>JWT on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/jwt/</link><description>Recent content in JWT on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/jwt/index.xml" rel="self" type="application/rss+xml"/><item><title>JWT认证机制实现原理</title><link>https://fe-interview.pangcy.cn/docs/network/network-28/</link><pubDate>Tue, 04 Mar 2025 09:31:00 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/network/network-28/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>安全机制理解&lt;/strong>：JWT的安全实现原理及防篡改机制&lt;/li>
&lt;li>&lt;strong>密码学应用能力&lt;/strong>：对称加密（HMAC）与非对称加密（RSA）在签名中的差异&lt;/li>
&lt;li>&lt;strong>系统设计思维&lt;/strong>：短期Token与Refresh Token组合方案的设计权衡&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>JWT三段式结构编码规范&lt;/li>
&lt;li>数字签名对报文完整性的保障机制&lt;/li>
&lt;li>不同签名算法的密钥管理策略&lt;/li>
&lt;li>无状态认证场景下的会话安全控制&lt;/li>
&lt;li>Token时效性与用户体验的平衡&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>JWT结构 &amp;gt; 数字签名算法 &amp;gt; Token时效策略&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>JWT采用Base64URL编码的JSON结构，包含：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Header&lt;/strong>：声明算法类型（alg）和令牌类型（typ）&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="4ea4fda" class="language-javascript ">
 &lt;code>// Header示例
{ &amp;#34;alg&amp;#34;: &amp;#34;HS256&amp;#34;, &amp;#34;typ&amp;#34;: &amp;#34;JWT&amp;#34; }&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="2">
&lt;li>&lt;strong>Payload&lt;/strong>：携带业务数据（claims）如用户ID、过期时间（exp）&lt;/li>
&lt;li>&lt;strong>Signature&lt;/strong>：对前两部分的签名，通过HMAC或RSA算法确保数据完整性&lt;/li>
&lt;/ol>
&lt;p>签名生成逻辑：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="dae4b75" class="language- ">
 &lt;code>HMAC_SHA256(base64(header) &amp;#43; &amp;#34;.&amp;#34; &amp;#43; base64(payload), secret)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>验证时服务端重新计算签名，与令牌中的签名比对。任何对Header/Payload的修改都会导致签名不匹配。&lt;/p>
&lt;p>&lt;strong>密钥差异&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>HMAC：对称加密，服务端存储密钥，计算效率高&lt;/li>
&lt;li>RSA：非对称加密，私钥签名公钥验签，适合微服务架构&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误将敏感数据存放在未加密的Payload中&lt;/li>
&lt;li>混淆JWT加密（JWE）与签名（JWS）的区别&lt;/li>
&lt;li>认为Refresh Token不需要服务端存储（实际需要持久化存储）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>JWT通过三段式结构实现无状态认证。Header声明算法，Payload携带业务数据，Signature通过HMAC或RSA确保数据完整性。以HMAC为例，服务端用密钥生成签名，任何对令牌的篡改都会导致签名验证失败。RSA方案通过私钥签名公钥验证，更适合多系统协作场景。&lt;/p>
&lt;p>短期Access Token（如15分钟）降低泄露风险，配合长期Refresh Token（如7天）实现平滑续期。Refresh Token需持久化存储并严格保护，当Access Token过期时，用户凭Refresh Token获取新Access Token。这种设计在保持无状态优势的同时，兼顾安全性与用户体验。&lt;/p>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="6d3f7cb" class="language-javascript ">
 &lt;code>// 生成JWT
const crypto = require(&amp;#39;crypto&amp;#39;);

function sign(payload, secret) {
 const header = Buffer.from(JSON.stringify({ alg: &amp;#39;HS256&amp;#39;, typ: &amp;#39;JWT&amp;#39; })).toString(&amp;#39;base64url&amp;#39;);
 const payloadEncoded = Buffer.from(JSON.stringify(payload)).toString(&amp;#39;base64url&amp;#39;);
 const signature = crypto.createHmac(&amp;#39;sha256&amp;#39;, secret)
 .update(`${header}.${payloadEncoded}`)
 .digest(&amp;#39;base64url&amp;#39;);
 return `${header}.${payloadEncoded}.${signature}`;
}

// 验证示例
function verify(token, secret) {
 const [headerB64, payloadB64, signature] = token.split(&amp;#39;.&amp;#39;);
 const expectedSig = crypto.createHmac(&amp;#39;sha256&amp;#39;, secret)
 .update(`${headerB64}.${payloadB64}`)
 .digest(&amp;#39;base64url&amp;#39;);
 return crypto.timingSafeEqual(
 Buffer.from(signature),
 Buffer.from(expectedSig)
 );
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>密钥轮转：HMAC场景使用密钥版本号，RSA场景定期更换密钥对&lt;/li>
&lt;li>分布式验证：通过JWKS端点发布公钥，适用于微服务架构&lt;/li>
&lt;li>性能优化：签名验证耗时较高时，采用本地缓存验证结果&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何防范JWT重放攻击？&lt;/strong>&lt;/p></description></item></channel></rss>