php isset 一文彻底搞懂 Cookie 与 Token:从底层机制到实战场景全解析

php isset 一文彻底搞懂 Cookie 与 Token:从底层机制到实战场景全解析

一文彻底搞懂 与 Token:从底层机制到实战场景全解析

本文从 的底层传输机制、浏览器存储原理,到 Token 认证方案的本质区别,结合流程图和代码示例,力求把这个问题讲透。

一、先厘清概念: 和 Token 不在同一维度

很多人把 和 Token 放在一起比较,但其实它们不是同一层面的东西:

两者不是对立关系。你完全可以把 Token 存在 里传输php issetphp isset,也可以存在 里通过 HTTP 手动传。

二、 的底层机制全解析2.1 的本质:纯文本键值对

在 HTTP 协议中的存在形式非常朴素——就是字符串。

服务端设置时,通过响应头逐条写入:

ini

HTTP/1.1 200 OK

Set-: theme=dark; Path=/; Max-Age=

Set-: lang=zh-CN; Path=/;

Set-: =; Path=/; ;

注意:每条 必须单独一个 Set- 头php isset,不能合并,这是 HTTP 规范规定的。在代码层面就是多次调用:

php

// PHP

(“theme”, “dark”, time() + );

(“lang”, “zh-CN”, time() + );

// () 自动加一条

java

// Java

.(new (“theme”, “dark”));

.(new (“lang”, “zh-CN”));

浏览器发送时,把同域下所有 拼成一行发回去:

ini

: theme=dark; lang=zh-CN; =

就这么简单,key=value 用分号拼接,纯文本。

2.2 值没有格式约束

的 value 部分完全自由,你想存什么都行:

ini

# 普通字符串

theme=dark

# 一个数字

=42

# 一段 JSON(需要 URL 编码)

prefs=%7B%%22%3A14%2C%%22%3A%22red%22%7D

# 框架加密后的客户端 数据

=…

# 一个毫无意义的随机 ID( ID)

=

至于这个字符串是明文还是加密的、是 JSON 还是随机 ID,完全由写入方自己决定php isset 一文彻底搞懂 Cookie 与 Token:从底层机制到实战场景全解析,HTTP 协议不关心。

2.3 谁能写入

不只是服务端。客户端 JS 同样可以写入:

javascript

. = “theme=dark; max-age=; path=/”;

但有一个重要限制:如果服务端设置 时加了 标志,那这条 客户端 JS 完全读不到也改不了,只有浏览器发请求时会自动带上。 ID 通常都会加这个标志,防止 XSS 攻击时被 JS 偷走。

2.4 浏览器如何存储

浏览器收到 Set- 后,不是拼成一个字符串存起来的,而是解析后按条目独立存储。可以理解为浏览器内部维护了一张关系型表:

每条 是一条独立记录,包含完整的键、值和所有属性。实际存储位置取决于浏览器实现,比如 用的是本地的一个 数据库文件。

2.5 浏览器发送时的筛选规则

浏览器每次发请求前,会对这张表执行一次 多条件筛选,用伪 SQL 来表达:

sql

key, value FROM

WHERE '当前请求域名'

AND path '当前请求路径'

AND ( = false OR 当前协议是HTTPS)

AND > NOW()

AND 规则通过;

筛选出来的结果集,拼成 key=value; key=value 发出去。

各属性的含义:

属性

作用

作用域名, 的 不会发给

Path

作用路径,Path=/admin 的 访问 /api 时不会带上

只有 HTTPS 请求才会携带

Max-Age /

过期时间,过期后自动从存储表中删除

禁止 JS 访问,防 XSS

控制跨站请求时是否携带,防 CSRF

注意:这些属性不会发送给服务端,它们是浏览器自己用的控制信息。服务端收到的永远只是那一行 key=value; key=value 的纯文本。

2.6 服务端如何解析

服务端框架在请求进入业务代码之前,就已经自动把 : a=1; b=2; c=3 按分号拆分、解码、封装成了语言原生的数据结构。你永远不需要手动 split:

php

// PHP — 直接就是关联数组

$

'theme'

// “dark”

$

'lang'

// “zh-CN”

$

''

// “”

java

// Java — 直接就是对象数组

= .();

for ( c : ) {

c.(); // “theme”

c.(); // “dark”

2.7 完整生命周期流程图

ini

┌──────────────────────────────────────────────────┐

服务端 │ 浏览器 │ 服务端

│ │

Set-: a=1 ──→ 解析属性,存入结构化表 │

Set-: b=2 ──→ 解析属性,存入结构化表 │

Set-: c=3 ──→ 解析属性,存入结构化表 │

│ │

│ 发起新请求时: │

│ ① 多条件筛选(域名+路径++过期+) │

│ ② 提取匹配的键值对 │

│ ③ 拼接为字符串 │

│ ──→ 收到 : a=1; b=2; c=3

│ │ 框架自动拆分为对象/数组/字典

│ │ 业务代码直接使用

└──────────────────────────────────────────────────┘

三个阶段的形态各不相同:设置时一条一条来,存储时结构化独立保存,发送时才拼成分号分隔的字符串。

三、 里常见的内容分类

打开浏览器开发者工具看 ,你往往会看到一堆内容。它们的来源和用途完全不同:

3.1 ID(框架自动写入)

最核心的一条,由框架自动管理。你只需要调用类似 () 的方法,框架自动完成生成 → 设置 → 读取的全流程。

ini

=-4F89-11D3-9A0C- # Java ()

= # PHP

ASP.= # ASP.NET

3.2 客户端 (框架加密写入)

有些框架不把 存在服务端,而是把整个 数据加密后直接塞进 返回给浏览器。比如 默认的 、 的 、Rails 的 。

ini

=…(一长串加密数据)

这和 JWT 的思路很像——信息存在客户端,服务端无状态。

3.3 业务数据(开发者手动写入)

开发者主动设置的用户偏好等信息:

php

(“theme”, “dark”, time() + 86400 * 30);

(“lang”, “zh-CN”, time() + 86400 * 30);

3.4 认证辅助信息

比如”记住我”功能的持久化 Token、CSRF Token 等:

ini

=…

XSRF-TOKEN=…

3.5 第三方

广告追踪、 、社交分享插件等第三方脚本写入的追踪标识。不是你的后端写的php isset 一文彻底搞懂 Cookie 与 Token:从底层机制到实战场景全解析,而是引入的第三方 JS 自动写入。

四、真正的对比:- 方案 vs Token 方案

当我们说” vs Token”时,真正在比较的是两种认证方案。

4.1 – 方案(有状态)

ini

┌────────┐ ┌────────┐ ┌──────────────┐

│ 浏览器 │ ① POST /login │ 服务器 │ ② 创建 │ 存储 │

│ │ ─────────────────────→ │ │ ──────────────→ │ (内存/Redis) │

│ │ │ │ │ │

│ │ ③ Set-: │ │ │ sid → { │

│ │ = │ │ │ : 1 │

│ │ ←───────────────────── │ │ │ role: admin│

│ │ │ │ │ } │

│ │ ④ : = │ │ ⑤ 查询 │ │

│ │ │ │ ──────────────→ │ │

│ │ ─────────────────────→ │ │ ←────────────── │ │

│ │ │ │ ⑥ 返回用户信息 │ │

└────────┘ └────────┘ └──────────────┘

4.2 Token 方案(无状态)

yaml

┌────────┐ ┌────────┐

│ 客户端 │ ① POST /login │ 服务器 │

│ │ ─────────────────────→ │ │ ② 生成 JWT:

│ │ │ │ ..

│ │ ③ 返回 Token │ │ = {

│ │ { token: “eyJhb…” } │ │ : 1,

│ │ ←───────────────────── │ │ role: “admin”,

│ │ │ │ exp:

│ │ ④ : │ │ }

│ │ eyJhb… │ │

│ │ ─────────────────────→ │ │ ⑤ 验证签名 + 检查过期

│ │ │ │ 直接从 Token 中读取用户信息

│ │ │ │ 无需查询任何存储

└────────┘ └────────┘

4.3 ID 与 Token 的本质类比

两者在认证流程中的角色完全对等,区别在于凭证本身承载的信息量不同:

ID

Token (JWT)

内容

一串无意义的随机字符串,如

自包含的信息载体,解码后可读出用户ID、角色、过期时间等

信息存储

服务端(内存/Redis/数据库)

客户端(Token 本身)

验证方式

拿 ID 去 存储里查

验证签名 + 检查过期时间

比喻: ID 相当于酒店房卡,刷卡后前台要去系统里查你是谁、住哪间房;Token 相当于身份证,拿到手一看就知道你是谁,只需要验证它是不是真的就行。

五、关键差异对比

维度

– 方案

Token 方案

状态

有状态,服务端需维护 存储

无状态,服务端不保存任何信息

扩展性

用户量大时 存储成为瓶颈,多服务器需共享

天然支持水平扩展,任何节点都能验证

跨域

受同源策略限制, 的 不会发给

Token 放在 里手动传输,不受域名限制

CSRF 风险

由浏览器自动携带,天然存在 CSRF 风险

需要代码主动取出并放入 ,天然免疫 CSRF

适用范围

仅限浏览器环境

任何能发 HTTP 请求的客户端

传输方式

浏览器自动携带

代码手动设置

六、哪些场景必须用 .1 移动端 App

iOS 和 原生应用没有浏览器的 管理机制,用 Token 放在请求头里是标准做法。

6.2 微服务架构

服务间调用如果用 ,每个服务都得访问共享的 存储,耦合很重。JWT 自包含身份信息,服务之间传递 Token 即可各自验证,不依赖中心化存储。

markdown

Token

用户 ──→ 网关 ──→ 订单服务(自己验证 Token)

──→ 支付服务(自己验证 Token)

──→ 用户服务(自己验证 Token)

6.3 第三方授权(OAuth 2.0)

比如”用微信登录某 App”,微信授权后返回的 Token 由 App 持有并调用微信 API。这种跨平台、跨系统的授权场景不可能靠 来实现。

6.4 跨域系统

前端部署在 ,API 在 ,甚至多个子系统共享同一套用户体系。 的域名绑定让跨域非常麻烦,Token 没有这个限制。

6.5 无状态 API 服务

面向大量客户端的公开 API(如开放平台),服务端不可能为每个调用者维护 ,用 Token(API Key / JWT)做认证是唯一合理的选择。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » php isset 一文彻底搞懂 Cookie 与 Token:从底层机制到实战场景全解析

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们