JWT概述

JWT鉴权:JWT代表JSON Web Token,JWT用于验证用户身份并传递用户状态信息。当用户登录一个网站或应用时,系统会生成一个JWT,其中包含着用户的信息,并将其发送回用户的设备。之后,当用户发出请求时,会将这个JWT附在请求头中,服务器通过验证JWT来确认用户的身份。

JWT(JSON Web Token)的基本结构,它包含Header(头部)、Payload(负载)和Signature(签名)三部分。其中,Payload 是用于存储用户信息的部分,通常称为 Claims( 声明)用于指代 Payload。JWT 的申明标准 Claims 包括发行者、主题、过期时间(如 isssubaudexp )等,但用户可能需要添加额外的自定义信息,比如用户 ID( UserID) 和用户名( UserName)。若用Golang实现这一点,则用户需要定义一个自定义的 Claims 结构体。

头部包含令牌的类型和签名算法。
负载包含用户信息或其他数据。
使用指定的签名算法和密钥对头部和负载进行签名,生成签名部分。将头部、负载和签名部分组合成一个完整的 JWT 字符串,格式为 base64url(header) + “.” + base64url(payload) + “.” + signature。

JWT在客户端存在一定的安全风险,但通过采取以下措施可以有效降低这些风险:

1.避免存储敏感信息:JWT的Payload部分虽然是经过签名的,但并没有加密,因此,JWT中包含的敏感数据是可以被解码的。为了防止JWT泄露敏感信息,需要在存储和使用JWT时格外小心。避免在JWT的Payload中存储敏感信息,如密码、私钥等,因为这些信息是可以通过解码获得的。

2.使用安全的签名算法:选择安全可靠的加密算法对数据进行加密和签名,如RS256或ES256等,避免使用不安全的none算法,这样可以提高安全性。

3.强制使用HTTPS:确保所有API请求通过HTTPS协议进行传输,并配置 HSTS 头,防止JWT在传输过程中被中间人攻击(MITM)窃取或篡改。

HSTS(HTTP Strict Transport Security) 是一种安全策略,它强制客户端(如浏览器)只能通过 HTTPS 与服务器通信,防止中间人攻击。

4.合理设置JWT的过期时间:通过设置exp(过期时间)字段来限制JWT的有效期,确保即使JWT被截获,攻击者也只能在短时间内使用它。配合刷新令牌机制(Refresh Token),在JWT过期后,可以通过刷新令牌获取新的JWT。

5.安全存储JWT:将JWT存储在HttpOnly Cookies中,这样即使存在XSS漏洞,JavaScript也无法访问JWT,增强了安全性。避免使用localStoragesessionStorage存储JWT,这些地方容易受到XSS攻击的威胁。

HttpOnly Cookies 是一种特殊的 Cookie,它只能由服务器设置和读取,客户端的 JavaScript 无法访问,从而防止 XSS 攻击

6.密钥管理与轮换:定期更换密钥,并支持在一段时间内同时使用新旧密钥,以实现平滑过渡。使用硬件安全模块(HSM)或密钥管理服务(KMS)来管理密钥,避免密钥泄露。

硬件安全模块(HSM) 是一种物理设备,用于安全地存储和管理密钥。密钥管理服务(KMS) 是一种云服务,提供密钥的创建、存储、轮换和删除等功能,确保密钥的安全性。

7.防止重放攻击:设置合理的JWT过期时间,并使用刷新令牌(Refresh Token)机制,这样即使 JWT 被截获,攻击者也只能在短时间内使用它。通过这些措施,可以有效降低JWT被滥用、伪造或泄露的风险,确保Web应用和API的身份验证机制保持高水平的安全性。

重放攻击 是一种网络攻击,攻击者截获并重发合法的请求,以冒充合法用户进行未授权的操作。通过设置合理的过期时间和使用刷新令牌可以有效防止重放攻击。

如何使用 JWT:

1)在用户登录时,服务器验证用户的凭据,如果验证成功,生成一个 JWT 令牌,其中包含用户的身份信息(如用户 ID)。

2)将这个令牌发送给客户端,客户端在后续的每个请求中都携带这个令牌。

3)服务器在接收到请求时,解析令牌并从中提取用户的信息,从而避免了对 Redis 或其他存储的多次查询。