什么是Token

对于初学者来说,大家对于token的理解不是很深,没关系,接下来我们一起来研究下token。

学习东西首先需要明白这个东西干什么用的,所以首先了解token的作用。有以下场景:
比如说刚刚我使用用户名和密码登录了一个网站(什么网站就无所谓了吧),然后一不小心关闭了浏览器,当我再次打开浏览器进入该网站时发现我已经退出了登录,这个时候我需要重新输入用户名和密码进行重新登录。如果是这样的话会很不友好。并且重新登录需要给服务器端发送用户名和密码,服务器端会根据发送过来的用户名且密码和数据库的用户名和密码进行比对,如果频繁的比较的话会造成服务器端的压力提升。有同学可能会想那有什么压力,不就是个比较嘛,但是同学你要想明白,一个网站在同一时间段内可不是你一个人在登录,这个就能够想明白了吧,所以这样做显然不合适吧。关于以上的描述你应该能够很好的理解吧。

举个例子吧:比如说你是一个门卫(当然你看肯定不是,要不然就不会在这里见面啦是不是),你的职责是负责给客户开门,并且要确认他的身份是不是业主,是业主才可以进入楼房。假设有一个家伙一上午频繁的出入10次,请问你是不是要开10次门,要确认10次身份?(当然你可能觉得觉得出入10次我就记住了,还确认什么确认,但是同学你要想明白,你现在就好比服务器端,服务器可是没有记忆能力的,一个客户端频繁向服务器发送请求,服务器可是不认识的,所以你可以把自己当成一个机器),那这样的话你的压力是不是暴增,烦也烦死了。所以有没有什么好的解决办法吗?那就是给每个客户发送一个令牌(比如门禁),以后他来之后只要带着令牌就可以了,你就不需要去验证身份了,是不是工作量就比较小了?

所以关于频繁给服务器端发送请求验证用户名和密码进行比对这件事是不是就好解决了呢?
如何解决:在浏览器第一次发送用户名和密码比对之后,服务器端会生成一串唯一的符号(令牌),然后响应时将这个令牌返回给客户端进行保存,以后只要我进入这个网站就把这个符号(令牌)发送给服务器端,因此服务器端知道你的身份之后就不需要到数据库进行比对了(因为你有令牌了),直接登录即可。那以上的这个令牌就是token了,token时在服务器端生成,响应时发送给客户端,客户端存在浏览器中(至于存储在什么地方,大家应该知道浏览器的存储技术有哪些吧,cookie/storage都是存储技术吧),以后发送请求带着你的token去服务器端就可以了。
流程如下:
1.客户端使用用户名跟密码请求登录
2.服务端收到请求,去验证用户名与密码
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
 

### 什么是 TokenToken 是一种身份认证机制,通常以字符串形式存在,用于验证用户的身份或权限。在许多开发和网络应用中,Token 被用来解决 HTTP 协议无状态的问题,确保服务器能够识别用户的登录状态或其他相关信息[^4]。 ### Token 的作用 1. **身份认证**:Token 作为用户的身份标识,允许服务器验证用户是否具有访问特定资源的权限。每次请求时,客户端将 Token 发送到服务器,服务器通过验证 Token 的有效性和签名来确认用户身份[^4]。 2. **授权控制**:Token 中可以包含用户的权限信息(如角色、范围等),服务器根据这些信息决定用户是否可以访问某些资源[^1]。 3. **无状态会话管理**:与 Session 不同,Token 是无状态的,服务器不需要保存用户的会话信息,所有必要的数据都存储在 Token 中。这种机制非常适合分布式系统和微服务架构[^2]。 ### Token 的工作原理 Token 通常以 JSON Web Token (JWT) 的形式存在,JWT 是一种开放标准 (RFC 7519),用于在各方之间安全地传输信息。JWT 的结构由三部分组成:Header、Payload 和 Signature。以下是 JWT 的基本工作流程: 1. 用户登录成功后,服务器生成一个 Token 并将其返回给客户端。 2. 客户端将 Token 存储在本地(如 `localStorage` 或 `sessionStorage`)。 3. 在后续请求中,客户端将 Token 添加到请求头中(如 `Authorization: Bearer <token>`)。 4. 服务器接收到请求后,解析并验证 Token 的签名和有效期,从而确认用户身份。 以下是一个简单的 JWT 示例: ```json { "header": { "alg": "HS256", "typ": "JWT" }, "payload": { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }, "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" } ``` ### Token 的应用场景 1. **用户认证**:在登录后生成 Token,用户在后续请求中携带该 Token 进行身份验证[^4]。 2. **单点登录 (SSO)**:多个应用共享同一个认证中心,用户只需登录一次即可访问所有关联的应用[^2]。 3. **API 认证**:在微服务架构中,Token 常用于 API 接口的身份验证和授权控制[^2]。 4. **分布式系统**:由于 Token 是无状态的,它非常适合在分布式系统中使用,避免了跨服务器共享会话状态的需求。 ### Token 的安全性注意事项 1. **HTTPS 加密**:Token 必须通过 HTTPS 传输,防止中间人攻击。 2. **签名验证**:确保 Token 的签名无法被伪造,服务器需要验证 Token 的签名以保证其真实性。 3. **短生命周期**:Token 应设置较短的有效期,过期后需重新获取,减少被滥用的风险。 4. **Refresh Token**:结合 Refresh Token 机制,在 Token 过期时允许用户无需重新登录即可获取新的 Token[^2]。 ### 示例代码 以下是一个使用 Python 和 Flask-JWT-Extended 实现 Token 验证的示例: ```python from flask import Flask, jsonify, request from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'your_secret_key' jwt = JWTManager(app) @app.route('/login', methods=['POST']) def login(): username = request.json.get('username', None) password = request.json.get('password', None) if username != 'admin' or password != 'password': return jsonify({"msg": "Bad username or password"}), 401 access_token = create_access_token(identity=username) return jsonify(access_token=access_token) @app.route('/protected', methods=['GET']) @jwt_required() def protected(): current_user = get_jwt_identity() return jsonify(logged_in_as=current_user) if __name__ == '__main__': app.run() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值