你每天都在用,却不一定了解的令牌机制
当你在手机上打开某个App,输入账号密码登录后,接下来几天都不用再登录,点开就能看信息。这个过程中,起关键作用的不是你的密码,而是一个叫“认证令牌”(Authentication Token)的东西。
它就像酒店给你的房卡。你拿身份证登记(相当于登录),前台给你一张房卡(令牌),之后进出房间不用再刷身份证,刷房卡就行。这张卡有时效,过期了就得重新登记。
令牌是怎么生成的?
用户输入账号密码后,服务器验证无误,就开始生成令牌。最常见的形式是JWT(JSON Web Token),由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。
头部说明令牌类型和加密算法,比如:
{
"alg": "HS256",
"typ": "JWT"
}载荷存放实际数据,比如用户ID、角色、过期时间:
{
"sub": "1234567890",
"name": "张三",
"role": "user",
"exp": 1735689600
}最后,服务器用一个密钥对前两部分进行签名,生成第三段。三段用点号连接,变成一串字符串:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuW8oOS4uiIsInJvbGUiOiJ1c2VyIiwiZXhwIjoxNzM1Njg5NjAwfQ.5d5lQ9rQeFvq2fDx7kzH3yZa8mJ6nK7b8cR9sT0uL1w为什么这样设计更安全?
传统方式每次请求都查数据库验证身份,效率低。令牌把必要信息打包,服务器只需验证签名是否被篡改,无需频繁查库。只要签名对得上,就知道这个令牌是自己发的,用户信息可信。
而且令牌可以设置有效期,比如2小时。过期后必须重新登录或刷新,降低被盗用的风险。有些系统还会结合刷新令牌(Refresh Token),让用户在不重新输密码的情况下获取新访问令牌。
实际开发中的常见做法
在写一个用户登录接口时,Node.js + Express 场景下可能这样生成JWT:
const jwt = require('jsonwebtoken');
app.post('/login', (req, res) => {
// 假设已验证用户名密码
const payload = {
userId: user.id,
role: user.role,
exp: Math.floor(Date.now() / 1000) + 7200 // 2小时后过期
};
const token = jwt.sign(payload, 'your-secret-key');
res.json({ token });
});前端拿到这个token后,后续请求都放在Authorization头里:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...服务器中间件解析token,提取用户信息,决定能否继续访问。
这套机制广泛用于Web API、移动App、单点登录等场景。理解它的生成原理,能帮你排查登录失效、跨域认证等问题,也能在设计系统时做出更合理的安全决策。