token详解

token(令牌) 是一种在计算机系统中用于标识用户身份、授权访问权限或传递安全信息的数字签名凭证,以下详细阐述Token的组成,以及在身份验证、授权和Web服务这三个方面的作用与实践:

目录

一、token的组成

1、JWT (JSON Web Token)

2、非JWT Token

3、加密Token

二、身份验证(Authenticatin)

三、授权(Authorization)

四、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都在其中起到了至关重要的作用。

### 大型语言模型中的Token解析 #### 什么是Token? 在大型语言模型(LLM)中,Token是处理文本数据的基础单元。这些基础单元是将自然语言转换成机器可理解格式的关键步骤[^2]。 #### 标记化过程(Tokenization) 标记化是指将连续的自然语言文本分解为离散单位的过程。这个过程涉及将文本分割成更小的部分——即Tokens。每个Token可以代表一个完整的词、部分词(如子词)、或是单个字符。例如,“transformer”这个词可能会被拆解成多个子词token:“trans-”,“form-”,以及“er”。这种灵活性使得模型能更好地理解和生成少见或复合词语。 #### Token的数量限制及其原因 由于基于Transformer架构的语言模型具有较高的时间和空间复杂度,随着输入序列长度增加,计算量会迅速膨胀至难以管理的程度。因此,大多数LLM都设定了最大允许的input/output tokens数目,常见的范围是从几千到几万不等。这样的设计不仅有助于保持性能稳定,也便于开发者合理规划资源分配。 #### Tokens作为数值标识符的作用 当原始文本经过分词后得到一系列tokens时,在送入神经网络之前还需要进一步编码为计算机易于操作的形式—也就是整数ID或其他类型的向量表示。这样做的好处是可以让不同位置上的相同词汇共享相同的参数更新路径,从而提高泛化能力;同时也方便后续阶段进行注意力机制下的交互运算。 ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') text = "Transformers are amazing!" encoded_input = tokenizer(text, return_tensors='pt') print(encoded_input['input_ids']) ``` 这段代码展示了如何利用Hugging Face提供的`BertTokenizer`类来进行简单的英文句子编码。它会输出该句对应的tensor形式的IDs列表,这就是所说的token ID序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值