JSON Web Token 认证原理

Photo by Andrew Ly on Unsplash

JSON Web Token(下面简称 JWT )常被用来作为认证凭据存储在浏览器本地。通过本文,我想阐述清楚 JWT 认证的实现过程和背后的原理。

JWT 中 header(头部信息)和 payload(载荷信息)使用 Base64URL 进行编码。和 Base64 编码一样,Base64URL 本身是一种编码算法,而不是加密算法,因此头部信息和载荷信息仍不能携带密码等敏感信息。

为此,我们可以在服务器端根据头部信息和载荷信息生成一个数字签名,放在 JWT 中发回给客户端进行储存。下次请求时,客户端携带这个 JWT 来与服务器进行交互。由于数字签名的引入,服务端可以检测这个 JWT 是否被篡改。若无篡改,则可直接取出 JWT 中用户名、账号等信息进行下一步判断。

数字签名

数字签名是 JWT 中用来防止本身被篡改的一个重要机制。其本质是一种加密的摘要算法。常用的 HS256 算法就是由 HMAC  + 摘要算法 SHA-256 构成。 HMAC 通过特定算法将给定的密钥与消息本身结合在一起,然后再形成摘要。因此只有知道密钥的人才能破解 HS256 产生的数字签名。但是 HS256 的最大问题是不能安全地在公网上分发密钥,因此只能做到谁签发谁验证。

RS256 是另一种数字签名方法。它是 RSA 算法和 SHA-256 算法的结合。首先由 SHA-256 生产摘要,然后通过 RSA 算法对摘要结果进行加密,作为最终的数字签名。这样产生的数字签名任何人都可以进行验证。只需服务器在发送签名的同时附带加密所使用的公钥即可。这种数字签名方法在 HTTPS 和 DNS SEC 中经常用到。

认证流程

在一次账号密码认证之后,服务器使用 HS256 对头部信息和载荷信息(携带用户账号名称)生成一个加密签名,置于 JWT 后发送给客户端,作为下次登陆的凭证。

客户端发送的请求都自动携带 JWT 进行认证发送给服务器。服务端首先利用 HS256 和密钥,对 JWT 中 头部信息和载荷信息做一次数字签名。只要此签名与 JWT 中的签名一致,服务器就认定这个凭证有效。之后服务器通过取出 载荷中携带的用户账号,与数据库进行关联,就可以获取到用户的其他信息,从而进行后续的个性化展示或 API 调用等操作。

相关阅读

Base64 编码

参考链接

维基百科——JSON Web Token

JSON Web Token 入门教程

JWT: The Complete Guide to JSON Web Tokens

发表评论

电子邮件地址不会被公开。 必填项已用*标注