认证姿势-Jwt-基础篇

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 认证姿势-Jwt-基础篇


一、定义

JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.

Json Web Token简称Jwt,是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间数据作为JSON对象安全地传输信息。 数据信息经过数字签名,可以被验证和信任。 JWT可以使用秘密(使用 HMAC算法)或使用RSAECDSA公钥/私钥对进行签名。Jwt中签名加密解密主要依靠加密令牌签名令牌,加密令牌将信息进行加密,避免其他方知道对应声明的信息内容,签名令牌验证加密信息中声明的完整性,当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方 。

二、结构

一个jwt包含以下结构:

  • Header
  • Payload
  • Signature

各个部分以点.进行分隔,xxxx.yyyy.zzzz

1、Header

头部由令牌类型Jwt以及签名使用的加密算法类型组成,例如HMAC SHA256RSA。该部分由Base64Url方式进行编码。

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

2、Payload

负载部分,包含了声明部分,声明是对用户实体信息以及附加数据信息的声明,分为三种类型,registered声明、public声明和private声明。

registered声明,为一组系列规则预定义的可用的,可互操作的声明,例如iss(发行者)exp(到期时间)sub(主题)aud(受众)等。声明名称仅仅三个字符,在自定义时需要注意该细节。该部分同样由Base64Url进行编码。

public声明,为使用JWT的人随意定义,为避免冲突,用户自定义时,应尽量避开[官方规范]https://www.iana.org/assignments/jwt/jwt.xhtml中包含的声明。

private声明,由同意使用它们的各方之间共享信息而创建的自定义信息。

案例如下:

{
    "sub":"testsub",
    "name":"ggcy",
    "iat":1516239022
}

需要注意的是,在 HeaderPayload 中避免存放涉及到私密内容,整体信息防篡改,但是对信息并不负责,数据内容的安全性,这里是读者需要注意的地方。

3、Signature

创建指纹,需要以下几个部分,HeaderPayload、一个秘钥,其中 HeaderPayload 都是需要 Base64Url 进行编码,几个部分最终由 Header 定义的加密算法进行加密。具体抽象逻辑如下:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

案例如下:

header

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

payload

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

signature

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload), 
  your-256-bit-secret
)
//生成结果如下
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

组合Jwt,结构如下:xxx.yyy.zzz,内容每一部分由.,进行间隔。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

如果觉得以上内容过于枯燥,想要更具体的体会对应的各个部分的内容,可以访问Jwt官方提供的在线Jwt生成页面,https://jwt.io/#debugger-io,进行尝试测试。

三、工作流程

1、用户请求特定的授权链接进行认证授权,获取对应用户凭证。

2、用户凭证登录成功后,用户能够获取到一个带有 Jwt 的返回结果,获取到的 Jwt 仅仅是在有效时间内能够正常使用,操作有效时间,就将失效。

3、当用户要访问对应受到权限保护的 Api 和资源时,都需要头部带有对应有效的 Jwt ,通常在 Header 中,参数作为 Authorization ,参数内置格式为 Beaer {token} 的方式,附带到当前的请求中。

四、好处和不足

说了工作原理,那对应使用 Jwt 有什么好处?或者说有什么优缺点?

首先考虑一个问题,传统的凭证下发方式都有哪些?

简单网络令牌 (SWT) 和安全断言标记语言令牌 (SAML)

1、好处

1)结构上

相比XmlJson的结构更加紧凑,字符串进行编码时,占用的空间更少。

2)安全上

SWT 只能由使用 HMAC 算法的共享秘密对称签名,JWTSAML 令牌可以使用 X.509 证书形式的公钥/私钥对进行签名,使用 Xml 在避免引入隐藏的安全相对于 Json 是更困难的。

3)使用上

Json 解释器对于大多数编程语言来说,更加方便,能够将结构直接映射到对象上,操作上更加便捷。Jwt中携带的公开信息,也能为跨系统交互提供一定的辅助操作。

2、不足

1)不是银弹

Jwt 并没有解决传统 SessionCookieOIDC(OpenId Connect) 等方式的跨域和 XSS 问题。

2)依赖秘钥加密解密

Jwt的生成和解密都需要依赖于 Secret ,常常需要以硬编码方式嵌入到系统中(或配置文件),对于秘钥的管控,影响了系统的安全性指数。

3)客户端控制缺失

一旦生成 Jwt 下发到客户端,保存在 Jwt 中的信息将对使用者来说,有效期间内,可视为透明,如果想要像 Session 那样进行远程控制异常账户,就需要使用更多的手段去弥补。

4)冗余的数据开销

本质上,对于 Session 来说,Jwt的数据长度是比前者大的,如果不对Payload的长度进行限制,实际长度和内容大小的优势将不复存在。

五、总结

从以上对 Jwt 的学习过程中,可以了解到,Jwt 只是一种在用户认证授权过程中,采取的一种比较简单并且防信息篡改的凭证方式,并不是事事都能估计和全面的银弹,使用时应当依据实际情况进行选择。

六、参考链接

[1]JWT-JSON WEB TOKEN使用详解及注意事项:

https://cloud.tencent.com/developer/article/1542175

[2] Jwt 介绍

https://jwt.io/introduction


相关文章
|
2月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
131 0
|
2月前
|
存储 JSON 安全
从入门到精通:Python中的OAuth与JWT,打造无懈可击的认证体系🔒
【8月更文挑战第4天】构建现代Web和移动应用时,用户认证与授权至关重要。Python集成OAuth和JWT技术,能轻松实现安全认证。本文从OAuth基础入手,介绍如何使用`requests-oauthlib`库简化流程,再到JWT进阶应用,利用`PyJWT`库生成及验证令牌。最后,探讨如何结合两者,创建无缝认证体验。通过代码示例,由浅入深地引导读者掌握构建坚固应用认证体系的方法。
62 2
|
21天前
|
安全 Java 数据安全/隐私保护
|
1月前
|
JSON 安全 数据安全/隐私保护
Python 安全性大揭秘:OAuth 与 JWT,不只是认证,更是信任的传递
【9月更文挑战第4天】在数字化时代,确保应用安全至关重要。Python 作为广泛使用的编程语言,提供了强大的安全认证工具,如 OAuth 和 JWT。OAuth 是一种授权框架,允许第三方应用在有限权限下访问用户资源;JWT 则是一种自包含的数据传输格式,用于安全地传递声明。通过合理配置和使用这些技术,可以有效提升应用安全性,保障用户数据安全。正确管理和定期更新密钥、严格测试 JWT 的生成与验证等最佳实践,对于构建安全可靠的应用至关重要。不断学习新威胁,是维护应用安全的永恒课题。
39 2
|
2月前
|
JSON 安全 数据安全/隐私保护
Python 安全性大揭秘:OAuth 与 JWT,不只是认证,更是信任的传递
【8月更文挑战第6天】在数字化时代,Python 通过 OAuth 和 JWT 筑牢应用安全防线。OAuth 是一种授权框架,允许第三方应用在用户授权下安全访问资源;JWT 则是一种自包含的声明传输格式,确保通信安全。两者结合使用,能有效进行身份验证及授权管理。然而,密钥管理和 JWT 有效期设置等仍是挑战,需谨慎处理以保障整体安全性。正确配置这些工具和技术,可为用户提供既安全又便捷的服务体验。
36 7
|
2月前
|
JSON 安全 数据安全/隐私保护
Python安全新篇章:OAuth与JWT携手,开启认证与授权的新时代
【8月更文挑战第6天】随着互联网应用的发展,安全认证与授权变得至关重要。本文介绍OAuth与JWT两种关键技术,并展示如何结合它们构建安全系统。OAuth允许用户授权第三方应用访问特定信息,无需分享登录凭证。JWT是一种自包含的信息传输格式,用于安全地传递信息。通过OAuth认证用户并获取JWT,可以验证用户身份并保护数据安全,为用户提供可靠的身份验证体验。
36 6
|
2月前
|
JSON 人工智能 算法
Golang 搭建 WebSocket 应用(四) - jwt 认证
Golang 搭建 WebSocket 应用(四) - jwt 认证
42 0
|
2月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
【8月更文挑战第5天】在日益重视数据安全与隐私保护的互联网时代,Python 作为一种流行的 Web 开发语言,其认证机制不断演进。OAuth 2.0 与 JSON Web Tokens (JWT) 成为两大热门安全认证方案,既能保障数据安全传输,又能简化用户认证流程。OAuth 2.0 通过角色分配(如资源拥有者、客户端等)实现授权,而 JWT 则以自我包含式令牌简化认证过程。在 Python 中,可以利用 Flask-OAuthlib 和 PyJWT 等库轻松实现这两种认证方式。
24 0
|
3月前
|
存储 监控 安全
通用快照方案问题之JWT认证如何解决
通用快照方案问题之JWT认证如何解决
24 0
|
4月前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
290 0

热门文章

最新文章

下一篇
无影云桌面