Token的作用

Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。
为什么要用 Token

要回答这个问题很简单,因为它能解决问题!

Token 能解决哪些问题呢?有如下几点:

Token 完全由应用管理,所以它可以避开同源策略

Token 可以避免 CSRF 攻击(保护ASP.NET 应用免受 CSRF 攻击 - 张善友 - 博客园)。

Token 可以是无状态的,可以在多个服务间共享。

Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。

前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。

于是,又一个问题产生了:需要为 Token 设置有效期吗?

需要设置有效期吗?

对于这个问题,我们不妨先看两个例子:

登录密码,一般要求定期改变密码,以防止泄漏,所以密码是有有效期的。

安全证书,SSL 安全证书都有有效期,目的是为了解决吊销的问题,对于这个问题的详细情况,来看看知乎的回答(为什么SSL证书要设有效期? - 知乎)。

所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token 都需要设有效期。

那么有效期多长合适呢?只能说,根据系统的安全需要,尽可能的短,但也不能短得离谱。

想像一下手机的自动熄屏时间,如果设置为 10 秒钟无操作自动熄屏,再次点亮需要输入密码,会不会疯?

如果你觉得不会,那就亲自试一试,设置成可以设置的最短时间,坚持一周就好(不排除有人适应这个时间,毕竟手机厂商也是有用户体验研究的)。

然后新问题产生了,如果用户在正常操作的过程中,Token 过期失效了,要求用户重新登录……用户体验岂不是很糟糕?

为了解决在操作过程不能让用户感到 Token 失效这个问题,有一种方案是在服务器端保存 Token 状态,用户每次操作都会自动刷新(推迟) Token 的过期时间——Session 就是采用这种策略来保持用户登录状态的。

然而仍然存在这样一个问题,在前后端分离、单页 App 这些情况下,每秒种可能发起很多次请求,每次都去刷新过期时间会产生非常大的代价。

如果 Token 的过期时间被持久化到数据库或文件,代价就更大了。所以通常为了提升效率,减少消耗,会把 Token 的过期时保存在缓存或者内存中。

还有另一种方案,使用 Refresh Token,它可以避免频繁的读写操作。这种方案中,服务端不需要刷新 Token 的过期时间,一旦 Token 过期,就反馈给前端,前端使用 Refresh Token 申请一个全新 Token 继续使用。

这种方案中,服务端只需要在客户端请求更新 Token 的时候对 Refresh Token 的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。

当然 Refresh Token 也是有有效期的,但是这个有效期就可以长一点了,比如,以天为单位的时间。

Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。

那么,Token有什么作用?又是什么原理呢?

Token一般用在两个地方:

  • 1)防止表单重复提交、
  • 2)anti csrf攻击(跨站点请求伪造)。

两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,Token会随着表单一起提交到服务器端。
然后,如果应用于“anti csrf攻击”,则服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。
不过,如果应用于“防止表单重复提交”,服务器端第一次验证相同过后,会将session中的Token值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token没变,但服务器端session中Token已经改变了。

上面的session应用相对安全,但也叫繁琐,同时当多页面多请求时,必须采用多Token同时生成的方法,这样占用更多资源,执行效率会降低。因此,也可用cookie存储验证信息的方法来代替session Token。比如,应对“重复提交”时,当第一次提交后便把已经提交的信息写到cookie中,当第二次提交时,由于cookie已经有提交记录,因此第二次提交会失败。
不过,cookie存储有个致命弱点,如果cookie被劫持(xss攻击很容易得到用户cookie),那么又一次gameover。黑客将直接实现csrf攻击。

所以,安全和高效相对的。具体问题具体对待吧。

### Token 在 IT 安全与认证中的作用 Token 是一种用于身份验证和授权的技术,在现代信息系统中扮演着重要角色。它通过提供一种轻量化的方式,使用户能够在多个设备上访问资源而无需频繁重新登录。 #### 身份验证的作用 Token 主要用来证明用户的合法身份。当用户成功完成一次身份验证(如输入用户名和密码),服务器会生成一个唯一的 Token 并将其返回给客户端[^1]。此后,每次请求时,客户端只需携带此 Token 即可表明其已通过验证的身份状态。这种方式不仅简化了用户体验,还提高了系统的效率。 #### 授权的功能 除了确认谁可以进入系统外,Token 还负责定义哪些操作被允许执行。例如,某些 API 请求可能仅限于特定权限级别的用户才能发起;此时可以通过检查附带的 Token 来决定是否授予相应权利[^3]。 ### 应用场景分析 1. **多终端支持** 利用基于令牌的身份验证方案能够很好地满足跨平台需求——即使是在不同类型的硬件设施间切换也能保持一致性的体验效果[^4]。 2. **无状态服务架构下的优势体现** 对于采用 RESTful 风格设计的服务端而言,由于不存在传统意义上的 session 存储概念,因此非常适合运用 token-based 认证模式来实现无缝衔接的数据交互过程。 3. **第三方应用集成** OAuth 2.0 等协议利用 access tokens 实现开放标准下应用程序之间的资源共享功能,使得开发者更容易构建连接外部服务的应用程序[^2]。 ```python import jwt def generate_token(user_id, secret_key): payload = { 'user_id': user_id, # 添加更多自定义声明... } token = jwt.encode(payload, secret_key, algorithm='HS256') return token.decode('utf-8') # Python JWT库默认返回字节串需解码为字符串形式 # 示例调用 secret = "my_secret" uid = 12345 print(generate_token(uid, secret)) ``` 上述代码片段展示了如何使用 PyJWT 库创建 JSON Web Tokens (JWT),这是目前最流行的 token 类型之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值