compare(输入密码, argon2_hash) → 通过则发 sid;失败回「邮箱或密码不正确」库里只有 argon2 摘要、密码无法还原;凭证不匹配用同一句通用提示,连错锁定账户、猛试 429 限流;sid 走 HttpOnly + Secure + SameSite Cookie,脚本读不到、日志不记密码。
数据与服务 · 账号与安全
登录是一次握手:交出标识和秘密,服务端比对存的 hash,通过就发一张可复用凭证(session id / token),之后每个请求靠它证明身份——登录只是鉴权的开始。
登录不是「点一下就进去了」:你交出标识和秘密,服务端比对存的 hash,通过就发一张可复用凭证。在这里亲手提交,看管线哪几段亮、凭证是否出现、连错和猛试如何升级。
以已注册账户 me@demo.com 为例(库里存的密码摘要是 $2b$12$R1p…aGh(bcrypt 摘要,库里只存这个,不存明文密码))。 填好密码点主操作「登录」,看握手管线哪几段亮、凭证物件是否出现、尝试日志如何升级。
POST /api/login按邮箱取存的 hash输入密码 → 摘要 → 比对随机 opaque sidHttpOnly; Secure; SameSite=Lax→ /favorites原因:还没提交。下一步:填好密码点「登录」,观察握手管线哪几段亮起、凭证物件是否出现。 对照:成功会一路亮到「302 跳转」并发出 sid;密码错在「比对」断开;锁定与 429 都不会走到发凭证。
提示:Tab 在邮箱 / 密码 / 各按钮间移动,Enter 直接提交。重点试三组对照:填正确密码看凭证出现; 连续「填错误密码」走 wrong → wrong → locked;连续点登录到第 5 次看 429(边缘挡在最前)。
面板已经把每次提交的结果演给你看了,这里把它们命名清楚,并补上无法直接操作的部分。
compare(输入密码, hash) 在服务端做;就算库里这张 $2b$12$… 泄漏也无法直接还原密码。Referer、网关访问记录把密码长期留存。从「这次调用要不要把匿名动作绑到一个身份」出发,而不是默认都加登录墙。
一次能跑通的登录握手,只走这几步。
<form> + <label> + autocomplete="username" / "current-password",POST /api/login 提交邮箱和密码。bcrypt.compare / argon2.verify 比对,不要自己拼摘要算法。Set-Cookie(HttpOnly + Secure + SameSite)或 Authorization token。Max-Age=0 清掉浏览器侧。只改几处关键选择,结果差很多。这是登录工程边界里最该记住的一组对照。
compare(输入密码, argon2_hash) → 通过则发 sid;失败回「邮箱或密码不正确」库里只有 argon2 摘要、密码无法还原;凭证不匹配用同一句通用提示,连错锁定账户、猛试 429 限流;sid 走 HttpOnly + Secure + SameSite Cookie,脚本读不到、日志不记密码。
SELECT password FROM users WHERE email=… 然后直接字符串比较库里被脱库一次,全部账号密码同时泄漏;两种错误响应能被脚本用来逐个探测已注册邮箱;没有限流可以无限撞库;明文进日志后,网关、监控、备份都会长期留底——任何一处泄漏都等于全员泄漏。
同一登录页,「该邮箱未注册」和「密码不正确」返回不同文案,最大的风险是什么?
术语的技术定义和行为以这些一手或权威资料为准。
和本知识点经常一起出现的概念。