摘要:
从软件工程角度看,任何 Web 应用的账号创建与登录场景,其背后实际上都涉及身份识别、身份认证、会话管理、Cookie、安全验证以及多因素认证等一系列典型的 Web 技术。
本文不讨论具体产品的账号创建步骤,而是以常见 Web 应用为例,从开发者角度系统介绍 Authentication、Authorization、Session、Cookie、Token、MFA 等核心概念,并通过简单代码理解一个现代 Web 登录系统是如何工作的。
一、为什么说"注册"本质上是一个身份系统问题?
无论是任何 Web 应用的注册,还是开发者平时使用的:
- GitHub
- 云服务平台
- 企业后台
- SaaS 系统
- 电商网站
- 内容管理平台
用户第一次进入系统时都会涉及一个共同问题:
text
系统如何知道"你是谁"?
这个问题对应的是:
text
Identity
即:
身份。
一个典型 Web 用户系统通常可以抽象成:
text
用户
↓
Identity
↓
Authentication
↓
Session
↓
Authorization
↓
Application
这里有四个特别重要的概念:
text
Identity
Authentication
Session
Authorization
它们看起来相似,但实际上承担完全不同的职责。
二、Identity是什么?
Identity 可以理解成:
系统中用于唯一表示一个用户的身份信息。
例如一个简单的用户表:
sql
CREATE TABLE users (
id BIGINT PRIMARY KEY,
username VARCHAR(100),
email VARCHAR(255),
password_hash VARCHAR(255),
created_at TIMESTAMP
);
其中:
text
id
通常是系统真正用于识别用户的唯一标识。
例如:
text
id = 10001
代表某一个确定的用户。
而:
text
username
email
更多属于:
text
User Attributes
即用户属性。
因此可以理解成:
text
Identity
│
├── User ID
├── Username
├── Email
└── Profile
其中真正稳定的身份标识通常是:
text
User ID
三、Authentication是什么?
Authentication 中文通常翻译成:
text
身份认证
它解决的问题是:
当前操作系统的人,是否真的是这个账户的拥有者?
例如用户声称:
text
我是User 10001
系统不能直接相信。
必须要求用户提供:
text
Credential
也就是:
认证凭据。
传统凭据可能是:
text
Username
+
Password
于是认证流程变成:
text
用户声明身份
↓
提交Credential
↓
Server验证Credential
↓
Authentication Success
只有验证成功之后,系统才能认为:
text
当前请求对应User 10001
四、Authentication和Authorization有什么区别?
这是 Web 开发中最容易混淆的两个概念。
Authentication:
text
你是谁?
Authorization:
text
你能做什么?
例如:
text
用户Alice
成功登录。
这一步属于:
text
Authentication
但是 Alice 是否能够:
text
删除用户
修改系统配置
查看财务数据
属于:
text
Authorization
因此:
text
Authentication
↓
Identity Confirmed
↓
Authorization
↓
Permission Check
可以简单总结:
| 概念 | 解决的问题 |
|---|---|
| Authentication | 你是谁 |
| Authorization | 你能做什么 |
五、为什么密码不能直接保存?
假设开发一个网站。
最简单的数据库设计可能有人会写:
sql
CREATE TABLE users (
username VARCHAR(50),
password VARCHAR(100)
);
然后直接保存:
text
username = alice
password = 123456
这种设计存在明显安全问题。
因为一旦数据库泄露:
text
Database Leak
↓
Plaintext Password
↓
用户密码直接暴露
攻击者可以立即看到全部用户密码。
因此现代 Web 系统通常不会直接保存:
text
Plaintext Password
而应该保存:
text
Password Hash
六、什么是Password Hash?
Hash 可以理解成一种单向计算。
例如:
text
password
↓
Hash Function
↓
Hash Value
假设:
text
password = example_password
经过哈希函数后得到:
text
$2b$12$xxxxxxxxxxxxxxxxxxxxxxxx
系统数据库保存的是:
text
Hash Value
而不是原始密码。
登录时:
text
用户输入Password
↓
使用相同算法进行验证
↓
比较结果
↓
Match
↓
Authentication Success
常见密码哈希算法包括:
text
bcrypt
scrypt
Argon2
PBKDF2
需要注意:
text
MD5
SHA1
并不适合直接作为现代密码存储方案。
七、一个简单的Python密码验证示例
例如使用 bcrypt:
python
import bcrypt
password = b"example-password"
password_hash = bcrypt.hashpw(
password,
bcrypt.gensalt()
)
print(password_hash)
验证:
python
is_valid = bcrypt.checkpw(
b"example-password",
password_hash
)
print(is_valid)
返回:
text
True
整个过程可以理解为:
text
Password
↓
bcrypt
↓
Password Hash
↓
Database
而不是:
text
Password
↓
Database
八、登录成功以后为什么不用每次重新输入密码?
这是很多初学者理解 Web 登录系统时最关键的问题。
假设没有 Session:
text
访问首页
↓
输入密码
访问个人中心
↓
再次输入密码
访问设置
↓
再次输入密码
显然不可接受。
因此:
text
Authentication
成功以后,服务器通常会建立:
text
Session
即:
会话。
可以理解为:
text
用户完成一次身份认证
↓
Server记录登录状态
↓
后续Request复用登录状态
九、Session是什么?
Session 是服务器保存的一段用户状态。
例如:
python
session = {
"session_id": "abc123",
"user_id": 10001,
"login_time": "2026-09-09",
"authenticated": True
}
服务器知道:
text
abc123
对应:
text
User 10001
以后浏览器只需要携带:
text
session_id
服务器就知道:
text
这个Request是谁发送的
十、Cookie是什么?
这里就会涉及:
text
Cookie
HTTP 有一个非常重要的特点:
text
HTTP is Stateless
即:
HTTP 本身是无状态协议。
例如浏览器连续发送:
http
GET /article
然后:
http
GET /profile
默认情况下服务器并不知道:
text
这两个Request是不是同一个用户
因此浏览器可以利用 Cookie 保存一部分状态信息。
例如:
http
Set-Cookie: session_id=abc123
之后浏览器请求:
http
GET /profile
Cookie: session_id=abc123
服务器读取:
text
session_id
即可找到对应:
text
User
十一、Session与Cookie的关系
一个典型流程如下:
text
User
│
│ Login
▼
Server
│
│ Authentication Success
▼
Create Session
│
│ session_id = abc123
▼
Browser
│
│ Save Cookie
▼
Next Request
│
│ Cookie: abc123
▼
Server
│
▼
Find Session
│
▼
Identify User
简单理解:
text
Session
=
Server保存状态
而:
text
Cookie
=
Browser保存Session标识
十二、一个简单的Flask Session示例
例如:
python
from flask import Flask, session
app = Flask(__name__)
app.secret_key = "replace-with-secure-secret"
@app.route("/login")
def login():
session["user_id"] = 10001
return "login success"
@app.route("/profile")
def profile():
user_id = session.get("user_id")
if not user_id:
return "not authenticated", 401
return f"user_id = {user_id}"
当访问:
text
/login
以后:
python
session["user_id"] = 10001
服务器建立会话。
之后访问:
text
/profile
即可读取:
python
session.get("user_id")
判断当前用户。
十三、为什么登录状态有时会失效?
Session 并不是永久有效。
通常都会设置:
text
Expiration Time
例如:
text
30 minutes
24 hours
7 days
具体时间取决于业务安全需求。
例如银行系统可能采用:
text
短Session
而普通内容网站可能采用:
text
较长Session
Session 生命周期可以表示为:
text
Login
↓
Session Created
↓
Active
↓
Expire
↓
Re-authentication
这是典型的安全设计。
十四、Cookie应该具备哪些安全属性?
生产环境中的 Session Cookie 通常需要关注:
text
HttpOnly
Secure
SameSite
例如:
http
Set-Cookie:
session_id=abc123;
HttpOnly;
Secure;
SameSite=Lax
HttpOnly
设置:
text
HttpOnly
后,JavaScript 无法直接读取该 Cookie。
主要用于降低部分:
text
XSS
攻击导致 Session 泄露的风险。
Secure
设置:
text
Secure
意味着 Cookie 只通过:
text
HTTPS
传输。
SameSite
用于限制跨站请求携带 Cookie 的行为。
常见值包括:
text
Strict
Lax
None
它与:
text
CSRF
防护存在重要关系。
十五、什么是CSRF?
CSRF:
text
Cross-Site Request Forgery
中文:
text
跨站请求伪造
例如用户已经登录:
text
example.com
浏览器保存:
text
Session Cookie
攻击页面尝试诱导浏览器向:
text
example.com/delete-account
发送请求。
如果系统只依赖 Cookie 判断身份,而没有其他保护机制,就可能产生:
text
CSRF Risk
常见防护包括:
text
CSRF Token
SameSite Cookie
Origin Check
Referer Check
十六、什么是Token Authentication?
除了传统:
text
Session
现代 Web API 还经常采用:
text
Token
进行认证。
例如:
text
Client
↓
Login
↓
Server
↓
Token
↓
Client
后续请求:
http
Authorization: Bearer xxxxx
服务器验证 Token 后识别:
text
User Identity
十七、Session和Token有什么区别?
可以简单对比:
| 项目 | Session | Token |
|---|---|---|
| 状态主要保存位置 | Server | Client持有Token |
| 常见用途 | Web网站 | API / App |
| Server是否保存状态 | 通常是 | 可以无状态 |
| 横向扩展 | 需要Session共享方案 | 相对方便 |
| 撤销控制 | 较简单 | 需要额外设计 |
实际系统并不是:
text
Session一定好
或者:
text
Token一定好
而应该根据业务需求进行选择。
十八、什么是JWT?
Token 系统中常见:
text
JWT
全称:
text
JSON Web Token
一个 JWT 通常由三部分组成:
text
Header
.
Payload
.
Signature
例如:
text
xxxxx.yyyyy.zzzzz
Payload 中可以包含:
json
{
"sub": "10001",
"role": "user",
"exp": 1780000000
}
其中:
text
sub
通常代表 Subject。
text
exp
代表过期时间。
十九、JWT不是加密数据
这是非常重要的一个知识点。
很多初学者认为:
text
JWT
=
Encrypted Data
实际上默认 JWT 的 Payload 通常只是:
text
Base64URL Encoding
因此:
text
JWT内容
通常可以被客户端解析。
JWT 的 Signature 主要解决的是:
text
数据是否被篡改
而不是:
text
数据是否能够被看到
所以不要在普通 JWT Payload 中放:
text
Password
银行卡信息
敏感隐私数据
Secret
二十、什么是MFA?
MFA:
text
Multi-Factor Authentication
即:
text
多因素身份认证
传统认证可能只有:
text
Password
一个认证因素。
MFA 则要求:
text
Factor A
+
Factor B
常见认证因素可以分为:
Something You Know
你知道的信息:
text
Password
PIN
Something You Have
你拥有的设备:
text
Authenticator
Security Key
Trusted Device
Something You Are
生物特征:
text
Fingerprint
Face
二十一、为什么MFA能够提高安全性?
假设攻击者通过某种方式获得:
text
Password
单因素认证下:
text
Password泄露
↓
Account Risk
而 MFA:
text
Password
+
Second Factor
意味着攻击者即使获得第一个凭据,还必须拥有第二个认证因素。
因此可以降低单一密码泄露带来的风险。
二十二、什么是Passkey?
Passkey 是近年来身份认证领域非常重要的一项技术。
它基于:
text
Public Key Cryptography
即:
公钥密码学。
基本思想:
text
Client
│
├── Private Key
│
Server
│
└── Public Key
登录时:
text
Server
↓
Challenge
↓
Client使用Private Key签名
↓
Server使用Public Key验证
整个过程中:
text
Private Key
不会发送给服务器。
二十三、为什么Passkey可以降低钓鱼风险?
传统密码需要用户:
text
输入Password
攻击网站可能通过伪造登录页面骗取密码。
而 Passkey 与:
text
Website Origin
存在绑定关系。
浏览器和系统认证器会参与判断当前站点身份。
因此 Passkey 从机制上可以减少一部分:
text
Phishing
风险。
二十四、现代Web认证架构是什么样的?
综合前面的技术,可以得到一个比较完整的模型:
text
┌──────────────────┐
│ User │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Authentication │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Credential Check │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ MFA / Security │
│ Verification │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Session / Token │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Authorization │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Application │
└──────────────────┘
这套架构不仅适用于 ChatGPT 注册场景。
同样适用于很多:
text
SaaS
Cloud
Developer Platform
CMS
Enterprise System
二十五、一个完整的登录接口应该考虑什么?
假设开发:
http
POST /api/login
不能只写:
python
if password == database_password:
return "success"
生产环境至少应该考虑:
text
Password Hash
Rate Limit
Session Security
Cookie Security
MFA
Logging
Brute Force Protection
HTTPS
CSRF
XSS
Account Lock
Audit Log
因此真正的 Authentication System 往往比:
text
一个Login API
复杂得多。
二十六、登录接口伪代码示例
可以抽象成:
python
def login(username, password):
user = find_user(username)
if not user:
return authentication_failed()
if rate_limit_exceeded(user):
return too_many_requests()
if not verify_password(
password,
user.password_hash
):
record_failed_attempt(user)
return authentication_failed()
if user.mfa_enabled:
return require_second_factor(user)
session = create_session(user)
return login_success(session)
这段代码体现了几个关键阶段:
text
Find User
↓
Rate Limit
↓
Verify Credential
↓
MFA
↓
Create Session
↓
Success
二十七、为什么登录错误不要暴露过多信息?
例如:
text
用户名不存在
和:
text
密码错误
如果分别返回非常明确的信息,攻击者可能通过接口判断:
text
哪些用户名真实存在
这叫:
text
User Enumeration
更安全的方式往往统一返回:
text
用户名或认证信息不正确
避免暴露:
text
Account Existence
二十八、为什么登录接口需要Rate Limit?
如果没有限制:
text
POST /login
攻击者可能不断尝试:
text
password1
password2
password3
password4
...
这属于:
text
Brute Force Attack
因此可以增加:
text
Rate Limiting
例如:
text
同一账户
5次 / 5分钟
或者根据:
text
Account
IP
Device
Risk Score
综合限制。
二十九、Web身份认证安全Checklist
如果自己正在开发用户系统,可以检查以下项目:
text
[ ] Password使用安全哈希算法
[ ] 不保存明文密码
[ ] 全站使用HTTPS
[ ] Session具有过期机制
[ ] Cookie启用HttpOnly
[ ] Cookie启用Secure
[ ] 合理配置SameSite
[ ] 登录接口存在Rate Limit
[ ] 防止User Enumeration
[ ] 重要账户支持MFA
[ ] Token具有Expiration
[ ] 不在Token中保存敏感数据
[ ] 关键行为记录Audit Log
[ ] 权限判断放在Server端
[ ] 定期失效长期Session
三十、从Web注册场景可以学到什么?
如果只从普通用户角度看:
text
注册
↓
登录
↓
进入系统
整个过程非常简单。
但是站在开发者角度:
text
Registration
↓
Identity
↓
Authentication
↓
Credential
↓
Session / Token
↓
Authorization
↓
Security
背后实际上是一整套身份系统。
因此,任何 Web 应用的注册场景,除了产品使用本身,更值得开发者关注的是它背后的:
text
Web Authentication Architecture
三十一、总结
现代 Web 身份认证系统,可以用下面这条链路概括:
text
Identity
↓
Authentication
↓
Credential Verification
↓
MFA
↓
Session / Token
↓
Authorization
↓
Application
其中:
text
Authentication
回答:
text
你是谁?
而:
text
Authorization
回答:
text
你能做什么?
Session 和 Cookie 负责维持:
text
登录状态
Token 更常见于:
text
API
Mobile App
Distributed System
MFA 和 Passkey 则进一步提升:
text
Account Security
如果正在学习 Web 开发,仅仅会写一个:
text
/login
接口还远远不够。
真正值得掌握的是:
text
Password Security
Session Management
Cookie Security
Token
CSRF
XSS
MFA
Passkey
Rate Limit
Authorization
这些概念共同构成现代 Web 身份系统的基础。
关键词
text
Web身份认证
Authentication
Authorization
Session
Cookie
Token
JWT
MFA
Passkey
Web安全
参考方向
本文主要围绕通用 Web 身份认证、安全与会话管理机制整理。相关技术可以进一步学习:
- Web Authentication
- HTTP Cookie
- Session Management
- Password Hashing
- JSON Web Token
- Multi-Factor Authentication
- Passkey / WebAuthn
- OWASP Authentication Security