数据字典和token值的使用

本文介绍了数据字典的概念及作用,并详细解释了Token在前后端交互中的应用,包括其产生的背景、目的以及如何在实际请求中使用。
  • 查询数据字典,字段
    • 数据字典:是对于数据模型中的数据对象或者项目的描述的集合;描述数据的信息集合,是对系统中使用的所有数据元素的定义的集合;
    • 数据字典的作用:数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义好描述,其目的是对数据流程图中的各个元素做出详细的描述;
    • 字段:一个成员,表示与对象或类关联的变量;表的一行的各个属性;
  • 什么时候请求头里面需要token值
    • token:客户端频繁向服务器端请求数据,服务器频繁的去数据库查询用户名和密码进行对比,判断用户名和密码是否正确,在这样的背景下,token百年产生了;
    • token:目的是为了减轻服务器的压力,减少频繁的查询数据库;
    • 在前端请求后台的API接口时,为了安全起见,一般需要在用户登录成功之后才能发送其它的请求;
    • 在用户登录之后,后台会返回一个token给前端,前端把token暂时保存在本地,每次发送请求的时候需要在header里面带上token(这样就可以不用带上密码和用户名);
    • 一般情况下,我们会对请求方法进行封装,会默认请求接口的时候header里面带上本地的token值,这样,每次请求的时候就不需要自己写token值,如果不是使用自己封装的请求方法,则需要记得在header请求头里面带上token值;
### Cookie 数据结构 Cookie 是存储在客户端(浏览器)的小段数据,以键对形式存在,格式为 `name=value`。例如 `user_id=123` ,这里 `user_id` 是名称,`123` 是对应的。除了键对,Cookie 还可以包含其他属性: - `Domain`:指定可以访问该 Cookie 的域名。例如 `Domain=example.com` ,表示该域名及其子域名可以访问此 Cookie。 - `Path`:指定可以访问该 Cookie 的路径。例如 `Path=/` 表示整个域名下的所有路径都可以访问。 - `Expires` 或 `Max - Age`:用于设置 Cookie 的有效期。`Expires` 是一个具体的日期时间,如 `Expires=Wed, 21 Oct 2023 07:28:00 GMT`;`Max - Age` 是一个以秒为单位的时间段,如 `Max - Age=3600` 表示 Cookie 有效期为 1 小时。 - `HttpOnly`:若设置了该属性,Cookie 只能通过 HTTP 请求访问,不能通过 JavaScript 脚本访问,可防止脚本攻击。 - `Secure`:若设置了该属性,Cookie 只会在使用 HTTPS 协议的安全连接中被发送到服务器。 每个 Cookie 大小限制通常为 4KB,每个域名最多能存储 20 - 30 个 Cookie。Cookie 会随每次 HTTP 请求被发送到服务器,因此存在被截获或窃取的风险,通常用于保存用户的登录信息、购物车数据、偏好设置等 [^3]。 ### Session 数据结构 Session 是服务器端存储的用户会话信息,通常基于 Cookie 实现,通过 Session ID 关联客户端服务器端的会话信息。在服务器端,Session 数据可以存储在多种地方,如内存、文件系统、数据库等。 #### 服务器端存储结构 服务器端的 Session 数据通常是一个字典(或类似的数据结构),以 Session ID 作为键,对应的是一个包含用户会话信息的对象。例如: ```python # 模拟服务器端的 Session 存储 sessions = { "abc123": { "user_id": 123, "username": "example_user", "last_activity": "2023-10-21 12:00:00" } } ``` 这里 `abc123` 是 Session ID,对应的是一个包含用户 ID、用户名最后活动时间的字典。 #### 客户端关联 客户端通过 Cookie 或其他方式(如 URL 重写、隐藏表单字段)保存 Session ID。例如,通过 Cookie 保存 Session ID 的方式如下:`Set - Cookie: JSESSIONID=abc123; Path=/; HttpOnly` 。后续请求客户端携带该 Session ID,服务器根据该 ID 查找对应的 Session 数据 [^2]。 ### Token 数据结构 Token 通常以 JWT(JSON Web Token)形式存在,是一个字符串,由三部分组成,通过 `.` 分隔: ```plaintext Header.Payload.Signature ``` #### 头部(Header) 头部通常包含两部分信息:Token 的类型(通常是 JWT)使用的签名算法(如 HMAC SHA256 或 RSA)。它是一个 JSON 对象,然后进行 Base64Url 编码。例如: ```json { "alg": "HS256", "typ": "JWT" } ``` 编码后可能是 `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9` 。 #### 载荷(Payload) 载荷包含声明(Claims),声明是关于实体(通常是用户)其他数据的声明。声明分为三种类型: - 注册声明:如 `iss`(发行人)、`sub`(主题)、`aud`(受众)等。 - 公开声明:由各方自由定义。 - 私有声明:在同意使用的一方之间定义。 例如: ```json { "user_id": 123, "username": "example_user", "exp": 1697923200 // 过期时间戳 } ``` 编码后可能是 `eyJ1c2VyX2lkIjoxMjMsInVzZXJuYW1lIjoiZXhhbXBsZV91c2VyIiwiZXhwIjoxNjk3OTIzMjAwfQ` 。 #### 签名(Signature) 签名用于验证 Token 的完整性真实性。要创建签名,需要使用编码后的头部、编码后的载荷、一个密钥(secret)头部中指定的签名算法。例如使用 HMAC SHA256 算法: ```python import hmac import hashlib import base64 header_encoded = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" payload_encoded = "eyJ1c2VyX2lkIjoxMjMsInVzZXJuYW1lIjoiZXhhbXBsZV91c2VyIiwiZXhwIjoxNjk3OTIzMjAwfQ" secret = "your_secret_key" signing_input = f"{header_encoded}.{payload_encoded}" signature = hmac.new(secret.encode(), signing_input.encode(), hashlib.sha256).digest() signature_encoded = base64.urlsafe_b64encode(signature).rstrip(b'=').decode() ``` 最终生成的 Token 可能是 `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsInVzZXJuYW1lIjoiZXhhbXBsZV91c2VyIiwiZXhwIjoxNjk3OTIzMjAwfQ.some_signature_value` 。 Token 可以存储在客户端的 Cookie、LocalStorage 中,也可以附加在请求的头部。服务器验证 Token 的签名有效期来进行身份认证 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值