一篇文章理解JWT(Json Web Tokens)
JWT(JSON Web Tokens)是一项RFC规范(参考 RFC 7519),它规定了如何使用JSON数据进行安全通信。这个规范明确指出,在两个实体之间安全地传输JSON表示的数据。通过HTTP的请求参数或Header字段进行传输时,JWT被表示为一个字符串。具体来说,在这种情况下,JWT通常由三个部分组成,并以点号分隔符连接起来。
header.payload.signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQiLCJleHAiOjEzNzE3MjA5Mzl9.
azSoRzdIHPLTNL2OsJsoXB1qCeThVYeEba_YYt6ZSTw
作为应用程序中的数据传输媒介,在JWT中包含有header字段采用JSON格式、payload存储用户数据以及使用公私钥对数据进行签名验证等关键组件。详细信息将在后续章节中提供。
JWT主要的使用场景有:
身份认证:在用户登录之后,后续操作将通过JWT进行身份验证。 数据传输:该系统将用于实现各类用户的日常数据交流。
一个典型的场景如下图所示:

客户端在提交前利用用户名和密码的身份验证机制向认证服务器发起身份验证请求。
认证服务器核实用户身份之后随后输出并发送一个Token至客户端端点。
该过程的具体步骤如下:
第一步是构建一个称为header的JSON对象。
{
"typ":"JWT",
"alg":"HS256"
}
该JSON由两个字段信息组成:typ字段标识Token的类型信息,默认情况下采用JWT;alg字段标识所使用的签名算法,默认采用HMACSHA256算法。
在payload部分中,在认证服务器验证了用户的密码之后,识别出用户的身份信息(ID),并将该信息整合到payload中,并为其设定了一段时间限制。
{
"userId":"b08f86af-35da-48f2-8fab-cef3904660bd",
"exp":1371720939
}
随后我们对header和payload分别采用base64urlEncode算法进行编码;The following step connects header and payload with point-to-point connections.;这些步骤利用私钥与HS256算法来实现签名。
private_key = "---...---"
header_code = base64urlEncode(header)
payload_code = base64urlEncode(payload)
data =header_code + "." + payload_code
signature = HMACSHA256(data,private_key)
jwt = data + "." + signature
通过以上的过程,认证服务器将jwt返回的客户端,格式如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQiLCJleHAiOjEzNzE3MjA5Mzl9.azSoRzdIHPLTNL2OsJsoXB1qCeThVYeEba_YYt6ZSTw
值得注意的是,在JWT机制中,并未采用加密技术来保护数据安全。相反地,它仅用于对数据进行编码与校验,并不能够有效保障数据的完整性和机密性。然而,在传统的HTTPS协议下仍为保障通信安全提供了基础保障。
③OK,客户端现在拿到JWT,可以使用认证服务器的公钥进行验证,拿到payload里面的数据,用于页面展示等。然后携带JWT想应用服务器请求API。
④API服务器拿到JWT后,同样使用认证服务器的公钥验证签名,判断用户是否经过认证,token是否还在有效期内等,同样可以拿到payload中的用户id,用于日志等数据存储。认证完成之后,将业务数据返回给客户端。
上述提到的payload部分,按照标准,主要用于三类声明:
- 类别字段被预先设定为特定用途。
- 例如, iss标识Token发行者, exp标识Token失效时间。
- 这类声明具有公共性质. 通常采用uri前缀等技术手段以防止冲突. 并经由IANA JSON Web Token registry统一登记.
- 由应用开发者自主选择其声明内容.
几乎每个编程语言都具备处理JSON Web Tokens(JWT)的功能包。其中一种广泛使用的Python实现是pyjwt库(可访问GitHub仓库:https://github.com/padilla/pyjwt),而官方文档则提供了一个全面的资源集。
参考文献:
_jwt官网对JWT功能详解:https://jtw.io/introduction
掌握JSON Web Token(JWT)的核心概念通常可以通过五个简明扼要的步骤来完成:https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec
