jwt,accesstoken、refresh token详解

JWT是一种紧凑的、自包含的网络安全传输信息格式,包括header,payload,signature三部分。JWT常用于身份验证,但不包含敏感信息且默认不加密。JWT的缺点包括不可回收和信息泄露风险。OAuth2引入了accesstoken和refreshtoken,通过短期的accesstoken和长期的refreshtoken来提高安全性,当accesstoken过期时,可以通过refreshtoken获取新令牌。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jwt,accesstoken、refresh token详解

JWT(json web token)

概念

JWT定义了一种紧凑的,自包含的形式,被用作在网络中安全的传输信息
格式
例如:xxxx.yyyyyyy.zzz
根据.分割,可以得到三部分,header,payload,signature。每部分可以使用Base64解码,就是一个JSON对象。
payload中会包含当前jwt的颁发者信息,JWT有效期,用户的凭证,权限信息,和用户自定义的信息等等。由于JWT是明文信息,所以不适合将一些敏感信息保存在JWT中

流程

客户端发起请求登陆,携带用户名和密码;
服务端验证身份,根据算法,将用户标识符打包生成token
服务器返回JWT信息给游览器,JWT不包含敏感信息;
客户端发起请求获取用户资料,把刚刚拿到的token一起发送给服务器;
服务器发现数据中有token,验明正身;
服务器返回该用户的用户资料;

JWT的6个缺点

1、JWT默认不加密,但可以加密。生成原始令牌后,可以使用改令牌再次对其进行加密。
2、当JWT未加密方法是,一些私密数据无法通过JWT传输。
3、JWT不仅可用于认证,还可用于信息交换。善用JWT有助于减少服务器请求数据库的次数。
4、JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。
5、JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。
6、为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。

安全在哪体现

JWT的安全性,说的是自身信息是防篡改,体现在它的签名部分signature。我们可以在生成JWT的时候,使用数字证书进行签名,采用非对称加密,可以很大程度的保证JWT的安全性。JWT默认是非加密的。
但是,JWT一经颁发,将无法回收,如果发生泄漏,将无法组织,这也是众所周知的JWT最大的问题。
JWT也是客服端-服务器在用户身份信息认证使用token形式的一种体现。jwt将用户身份信息认证保存在客户端,服务端也就不用维护用户状态,大大减轻了服务器的压力。客户端每次请求中,只需要携带这个JWT信息,
服务器根据JWT信息进行身份认证即可。

OAuth2(认证)

由上述可知,JWT存在颁发不可回收问题。如果JWT信息发生泄漏,就可以凭借此信息一直访问服务器信息,
只有等到JWT自动过期,用户的信息才会失效。
那么我们怎么维护用户身份信息呢?
我们可能最先想到,使用Redis(数据库)保存JWT信息,将信息维护服务器。
如果我们真的使用这种方式,那不就又回到了最初的使用服务端保存token的方式了吗?那这个JWT还有存在的必要吗?
第二种方式,我们尽可能短的设置JWT的有效时间,那么,就算用户的JWT信息泄漏了,对系统的访问时间也就尽可能的短了。
而在OAuth2中提出了access_token和refresh_token这两个概念
access_token
用于在客户端的一般请求中,使用此JWT信息验证用户身份。它的有效期通常设置的很短。
refresh_token
用于在access_token失效时,交换新的access_token。

基本流程

客户端向从资源所有者请求授权。
客户端收到授权许可,资源所有者给客户端颁发授权许可(比如授权码code)
客户端与授权服务器进行身份认证并出示授权许可(比如授权码code)请求访问令牌。
授权服务器验证客户端身份并验证授权许可,若有效则颁发访问令牌(accept token)。
客户端从资源服务器请求受保护资源并出示访问令牌(accept token)进行身份验证。
资源服务器验证访问令牌(accept 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序列。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值