02 - 登录到底在做什么:认证 vs 会话保持
上一章我们知道了:登录的根源问题是”服务端会失忆”。这一章,我们把”登录”这个动作本身拆开看。
很多人一提登录,脑子里就是一团糨糊:验证密码、发 token、存 session、cookie、过期……全搅在一起。其实只要你把它拆成两件独立的事,一切就清晰了。
登录 = 一次”验明正身” + 之后持续”记住你”
┌─────────────────────────────────────────┐
│ 登录 │
└─────────────────────────────────────────┘
│ │
┌────────────┘ └────────────┐
▼ ▼
① 认证(Authentication) ② 会话保持(Session Management)
"你真的是张三本人吗?" "接下来我怎么一直记得你是张三?"
只做一次 贯穿之后每一个请求
看的是:用户名 + 密码 靠的是:凭证(手环/通行证)
这两件事发生的时机、要解决的问题、用到的技术,全都不一样。分清它们,是理解登录的关键第一步。
第一件事:认证——“证明你是你”
这一步只做一次,就发生在用户点”登录”、把账号密码提交上来的那一刻。服务端要回答的问题是:
“提交这个密码的人,真的是账号的主人吗?”
它做的事很朴素:
用户提交:username = 张三, password = 123456
│
▼
服务端:去数据库把"张三"这条记录捞出来
比对:提交的密码 和 数据库里存的密码,对得上吗?
│
┌─────────┴─────────┐
▼ ▼
对得上 对不上
"验明正身,是本人" "密码错误,滚"
注意:这里有个大坑——数据库里绝对不能存明文密码,存的是哈希值。这块我们放到第 08 章安全篇专门讲。现在你只需要知道:“认证 = 比对密码,确认是不是本人。”
认证一旦通过,这一步的使命就完成了。用户不可能每查一次订单就重新输一次密码,所以接下来必须靠第二件事。
第二件事:会话保持——“之后一直记得你”
认证通过后,服务端会发给用户一个凭证(上一章说的”手环”或”通行证”)。从这一刻起,进入第二件事:
“在后续的每一个请求里,凭这个凭证,重新确认你就是刚才那个通过认证的张三。”
认证通过 ──▶ 发凭证 ──▶ 用户拿着凭证
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
GET /my/orders GET /my/profile POST /my/address
带上凭证 带上凭证 带上凭证
服务端:是张三 ✅ 服务端:是张三 ✅ 服务端:是张三 ✅
会话保持才是登录体系里真正复杂、真正有讲究的部分。后面 Session 和 Token 两条路线的分歧,全都发生在这一步——它们在”凭证长什么样、服务端怎么靠凭证认出你”上做了不同的选择。
为什么一定要分清这两件事?
因为很多设计上的困惑,本质都是这两件事没分清导致的。举几个例子:
| 你的困惑 | 其实是在问哪件事 |
|---|---|
| “密码错了怎么处理?” | 认证 |
| “登录成功后返回什么给前端?” | 会话保持(发什么凭证) |
| “为什么刷新页面还是登录状态?” | 会话保持(凭证被浏览器带上了) |
| “退出登录怎么实现?” | 会话保持(怎么让凭证失效) |
| “token 过期了怎么办?” | 会话保持(凭证的生命周期) |
| “改了密码后要不要重新登录?” | 两件事的交界处 |
你会发现:认证只占登录的一小步,会话保持才是大头。 这也是为什么后面 8 章里,绝大部分篇幅都在讲会话保持相关的话题。
一张图记住整个第一部分
第 01 章:HTTP 会失忆
│
▼
所以登录要解决"如何持续认出你"
│
┌───────────┴───────────┐
▼ ▼
① 认证(做一次) ② 会话保持(贯穿始终)
验密码,证明是本人 发凭证,之后靠凭证认人
│
┌───────────┴───────────┐
▼ ▼
路线 A:Session 路线 B:Token
(第 03 章) (第 04 章)
小结
- 登录不是一件事,而是两件事:认证(验明正身,只做一次)+ 会话保持(发凭证,之后一直记得你)。
- 认证看的是账号密码,通过后使命就完成;它只是登录里的一小步。
- 会话保持才是登录的大头和难点,Session / Token 两条路线的所有区别都在这一步。
- 分清这两件事后,你再看”退出、过期、刷新、改密码”这些问题,就知道它们各自属于哪一块了。
从下一章开始,我们正式进入会话保持的两条路线。先讲最经典、也最容易理解的路线 A:Session + Cookie。
上一章 ← 01 - 一切的根源:HTTP 是”没有记忆”的 | 下一章 → 03 - 路线 A:Session + Cookie | 回到 README 目录