Token的组成部分

token是计算机术语:令牌,令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧。token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

1.客户端使用用户名跟密码请求登录

2.服务端收到请求,去验证用户名与密码

3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。

为了更好的理解这个token是什么,我们先来看一个token生成后的样子,下面那坨乱糟糟的就是了。

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ3YW5nIiwiY3JlYXRlZCI6MTQ4OTA3OTk4MTM5MywiZXhwIjoxNDg5Njg0NzgxfQ.RC-BYCe_UZ2URtWddUpWXIp4NMsoeq2O6UF-8tVplqXY1-CI9u1-a-9DAAJGfNWkHE81mpnR3gXzfrBAB3WUAg

但仔细看到的话还是可以看到这个token分成了三部分,每部分用 . 分隔,每段都是用 Base64 编码的。如果我们用一个Base64的解码器的话 ( https://www.base64decode.org/ ),可以看到第一部分 eyJhbGciOiJIUzUxMiJ9 被解析成了:

{
    "alg":"HS512"
}

这是告诉我们HMAC采用HS512算法对JWT进行的签名。

第二部分 eyJzdWIiOiJ3YW5nIiwiY3JlYXRlZCI6MTQ4OTA3OTk4MTM5MywiZXhwIjoxNDg5Njg0NzgxfQ 被解码之后是

{
    "sub":"wang",
    "created":1489079981393,
    "exp":1489684781
}

这段告诉我们这个Token中含有的数据声明(Claim),这个例子里面有三个声明:sub, created 和 exp。在我们这个例子中,分别代表着用户名、创建时间和过期时间,当然你可以把任意数据声明在这里。
看到这里,你可能会想这是个什么鬼token,所有信息都透明啊,安全怎么保障?别急,我们看看token的第三段 RC-BYCe_UZ2URtWddUpWXIp4NMsoeq2O6UF-8tVplqXY1-CI9u1-a-9DAAJGfNWkHE81mpnR3gXzfrBAB3WUAg。同样使用Base64解码之后,咦,这是什么东东

D X �DmYTeȧL�UZcPZ0$gZAY�_7�wY@ 

最后一段其实是签名,这个签名必须知道秘钥才能计算。这个也是JWT的安全保障。这里提一点注意事项,由于数据声明(Claim)是公开的,千万不要把密码等敏感字段放进去,否则就等于是公开给别人了。
也就是说JWT是由三段组成的,按官方的叫法分别是header(头)、payload(负载)和signature(签名):

header.payload.signature

头中的数据通常包含两部分:一个是我们刚刚看到的 alg,这个词是 algorithm 的缩写,就是指明算法。另一个可以添加的字段是token的类型(按RFC 7519实现的token机制不只JWT一种),但如果我们采用的是JWT的话,指定这个就多余了。

{
  "alg": "HS512",
  "typ": "JWT"
}
### JWT Token组成结构 JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地传输信息。JWT Token 主要由 **Header**、**Payload** 和 **Signature** 这三个部分组成,它们之间通过点号 (`.`) 分隔。 #### Header(头部) Header 部分通常包含两部分内容:令牌的类型(即 `JWT`),以及所使用的签名算法(如 HMAC SHA256 或 RSA)。这部分会被编码成 Base64Url 格式[^4]。 例如: ```json { "alg": "HS256", "typ": "JWT" } ``` #### Payload(负载) Payload 是 JWT 的主体内容部分,包含了声明(Claims)。这些声明可以传达关于实体(通常是用户)和其他数据的信息。声明分为三种类型:注册声明(Registered claims)、公共声明(Public claims)和私有声明(Private claims)。同样,这一部分也会被编码为 Base64Url 格式。 一个典型的 Payload 可能如下所示: ```json { "sub": "1234567890", // 主体(Subject) "name": "John Doe", // 姓名 "iat": 1516239022 // 发行时间(Issued At Time) } ``` #### Signature(签名) 为了验证消息是否被篡改,以及确保消息来自可信任的一方,JWT 使用签名来保护其完整性。签名是由编码后的 Header 和 Payload 数据,加上一个密钥,再通过指定的算法计算得出的结果。 签名的生成过程可以用以下伪代码描述: ```plaintext HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) ``` 最终,完整的 JWT 将呈现为这样的形式: ```plaintext <base64url-encoded-header>.<base64url-encoded-payload>.<signature> ``` 以下是 Python 中生成 JWT 的简单示例: ```python import jwt header = {"alg": "HS256", "typ": "JWT"} payload = { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } secret_key = "my_secret_key" token = jwt.encode(payload, secret_key, algorithm="HS256", headers=header) print(token) decoded_token = jwt.decode(token, secret_key, algorithms=["HS256"]) print(decoded_token) ``` 上述代码展示了如何利用 PyJWT 库创建并解码一个 JWT Token。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值