token(令牌) 是一种在计算机系统中用于标识用户身份、授权访问权限或传递安全信息的数字签名凭证,以下详细阐述Token的组成,以及在身份验证、授权和Web服务这三个方面的作用与实践:
目录
一、token的组成
1、JWT (JSON Web Token)
JWT是最常用的Token格式之一,其组成非常明确且标准化。一个JWT由三部分组成,各部分之间用.
(点号)分隔:
1、Header(头部)
描述Token的基本元数据,通常包含:
- typ (type): 标识Token的类型,对于JWT,通常是 "JWT"。
- alg (algorithm): 指定用于签名Token所使用的加密算法,如 "HS256"(HMAC SHA-256)、"RS256"(RSA with SHA-256)等。
Header通常以Base64 URL安全编码表示。
2、Payload(载荷)
存储实际的声明(claims),即携带的用户信息和额外数据。常见的标准声明包括:
- iss (issuer): 发行Token的实体。
- sub (subject): Token所代表的主体(如用户ID)。
- aud (audience): 接收Token的受众(如服务端API)。
- iat (issued at): Token的发行时间。
- exp (expiration time): Token过期时间,以Unix时间戳表示。
- jti (JWT ID): Token的唯一标识符,有助于防止重放攻击。
除此之外,还可以包含自定义声明,用于传递特定应用所需的信息。Payload同样以Base64 URL安全编码表示。
3、Signature(签名)
通过对Header和Payload的组合进行指定算法(Header中alg字段指定的算法)的计算,生成一个用于验证Token完整性和防篡改的签名。计算过程中通常结合一个密钥(secret),确保只有持有该密钥的实体才能生成有效的Token。
签名也是Base64 URL安全编码表示。
假设我们有一个使用HS256
算法签名的JWT,其内容如下:
Header:
{
"alg": "HS256",
"typ": "JWT"
}
Payload:
{
"sub": "1234567890", // 用户ID
"name": "John Doe",
"email": "john.doe@example.com",
"iat": 1516239022, // 发行时间(Unix时间戳)
"exp": 1516239322, // 过期时间(Unix时间戳)
"role": "user" // 用户角色
}
Signature: (由Header和Payload经过HS256
算法与密钥secret
计算得出,此处省略实际计算过程)
将上述三个部分分别Base64 URL安全编码后,以.
连接,得到完整的JWT:
eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIiwgImlhdCI6IDE1MTYyMzkwMjIsICJleHAiOiAxNTE2MjM5MzIyLCAicm9sZSI6ICJ1c2VyIn0.(此处为Base64编码后的Signature)
2、非JWT Token
对于非JWT类型的Token,其组成可能更为灵活,但通常仍包括以下核心元素:
1、身份标识符
用户的唯一标识符,如用户ID(uid)。这是识别Token关联用户的最基本信息。
2、时间戳
发行时间(iat)和/或过期时间(exp),用于判断Token的有效期。过期时间有助于确保短期访问权限,并减少长期未使用的Token带来的安全风险。
3、签名或哈希
使用密钥和特定算法(如HMAC、RSA等)对Token的其他部分或部分信息进行签名或哈希运算,生成一个验证Token完整性和来源的值。这可以防止Token被篡改。
4、附加信息(可选)
角色、权限、会话ID、设备信息等附加数据,根据应用需求可能包含在Token中,用于更精细的访问控制和上下文识别。
例如,一个简单的基于HMAC-SHA256签名的自定义Token格式可能如下:
Token内容:
uid=1234567890&iat=164¾894321&exp=1648947321&hmac=(此处为HMAC-SHA256签名)
其中:
- uid=1234567890 表示用户ID。
- iat=164894321 表示发行时间(Unix时间戳)。
- exp=1648947321 表示过期时间(Unix时间戳)。
- hmac= 后跟的是对uid=1234567890&iat=164894321&exp=1648947321这部分内容,使用HMAC-SHA256算法与密钥计算出的签名。
3、加密Token
对于需要更高安全级别的场景,Token可能会采用加密方式来保护敏感信息。加密Token除了包含上述组成部分外,还会对载荷(Payload)部分进行加密处理,使得未经解密无法直接读取其中的内容。解密通常需要持有对应的解密密钥。
加密Token通常会对Payload进行加密处理,以保护敏感信息。例如,使用AES对称加密算法加密Payload:
加密前Payload:
{
"sub": "1234567890",
"name": "Jane Smith",
"email": "jane.smith@example.com",
"iat": 164894321,
"exp": 1648947321,
"sensitiveInfo": "Confidential data"
}
加密后Payload:
(此处为AES加密后的密文)
Token整体可能包含加密后的Payload、加密算法标识、IV(初始化向量,对于某些加密模式是必需的)、以及用于解密的密钥标识(如密钥ID)。实际格式取决于系统设计,但关键在于,未经解密密钥,无法直接读取Payload中的敏感信息。
二、身份验证(Authenticatin)
token在网络通信中的身份验证过程通常包括以下步骤:
1、用户登录:
用户向服务器提供有效的身份凭证(如用户名、密码),经过服务器验证通过后,表明用户身份已得到确认
2、token生成:
服务器在用户身份验证成功后,生成一个Token。这个Token通常包含用户标识符、过期时间、可能还有一些其他安全属性(如发行时间、会话ID等)。对于某些Token类型(如JWT),还可能包含用户的角色、权限等附加信息。
3、token发放:
服务器将生成的Token返回给用户端(如浏览器、移动端应用)。用户端可以将其存储在Cookie、LocalStorage、HTTP Only Cookie、内存中,或者作为HTTP请求头的一部分发送。
4、token携带:
在后续的网络通信中,用户端在发起请求时,将Token附在请求中(通常在Authorization HTTP头中以Bearer Token的形式)。例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
5、服务器验证:
服务器接收到请求后,首先提取请求中的Token。然后,根据Token的类型和配置,服务器执行相应的验证逻辑,如:
- 验证Token的签名以确保其未被篡改。
- 检查Token是否已过期。
- 核实Token中的用户标识符是否存在且有效。
- 解析Token中的附加信息,如角色、权限等。
如果Token验证通过,服务器认为请求发起者的身份已得到确认,从而完成身份验证过程。
三、授权(Authorization)
Token在网络通信中实现授权的主要方式如下:
权限编码:
Token可以内嵌用户的权限信息,如角色、操作权限、访问资源的范围等。这些信息通常在Token生成时被服务器写入,并在验证Token时被解析和使用。
访问决策:
当服务器接收到带有Token的请求时,除了验证Token以确认用户身份外,还会进一步检查Token中包含的授权信息,以确定用户是否有权执行请求的操作或访问请求的资源。这一步骤可能涉及:
- 解析Token载荷中的权限字段(如scope、roles等)。
- 将Token中的权限与请求所需的权限进行比较。
- 根据比较结果决定是否允许请求继续执行。
细粒度控制:
Token可以支持细粒度的访问控制策略,如基于资源的访问控制(RBAC)、基于属性的访问控制(ABAC)等。服务器可以根据Token中编码的权限数据,精确控制用户对特定资源的操作权限,如读、写、删除等。
四、Web服务
Token在Web服务场景中的应用包括:
无状态服务:
使用Token可以实现无状态的Web服务。因为Token自身包含了必要的身份和权限信息,服务器无需在本地存储会话状态(如传统Session)。这样不仅简化了服务端架构,提高了可扩展性,还利于跨域通信和微服务架构下的身份验证。
API访问控制:
对于RESTful API和微服务架构,Token是实现API访问控制的标准手段。客户端(如移动应用、第三方服务)通过提供有效的Token来访问受保护的API资源。服务器通过验证Token,确保只有授权的客户端才能访问相应的API。
跨域支持:
Token不受同源政策限制,可以在不同域名或子域之间自由传递,因此非常适合实现跨域的身份验证和授权。这对于构建多客户端、多平台的Web服务至关重要。
OAuth 2.0 & OpenID Connect:
Token在OAuth 2.0协议中起着核心作用,用于授权第三方应用访问用户在授权服务器上的资源。OAuth 2.0定义了多种Token类型,如Access Token(用于访问资源)、Refresh Token(用于刷新Access Token)等。OpenID Connect则在OAuth 2.0基础上扩展了身份验证功能,使用ID Token传递用户身份信息。
单点登录(SSO):
Token使得用户在一个系统中登录后,能够无缝访问多个相关系统,无需重新验证身份。SSO系统通过Token在各个子系统间传递用户身份信息,实现统一的身份验证和授权管理。
总的来说,Token在网络通信中充当了身份验证的凭证、授权决策的基础和Web服务安全交互的关键纽带。它通过封装和传递用户身份、权限信息,实现了用户身份的远程验证、资源访问的精细化控制以及无状态、跨域的Web服务安全交互。无论是简单的Web应用登录验证,还是复杂的API访问授权,Token都在其中起到了至关重要的作用。