登录解决谁,授权解决能做什么
认证确认请求者的身份,授权检查该身份是否可以访问指定资源。一个有效登录会话不代表它可以读取所有用户的数据。服务端必须同时检查资源归属和操作权限,页面上隐藏按钮不构成授权。
例如进度记录以用户 ID 和知识点 ID 标识。读取、创建和更新都需要限定当前站主;更新时还要防止把记录的用户 ID 改成另一个人。可由用户自行编辑的昵称或元数据不适合承载管理员权限。
会话与浏览器
服务器可以用随机会话 ID 关联登录状态,通过带 HttpOnly、Secure 和适当 SameSite 设置的 Cookie 发送。前端脚本无法直接读取 HttpOnly Cookie,但跨站脚本仍可能发起当前用户权限下的操作,因此还需防范 XSS。
写接口应校验来源与请求格式,并结合会话策略处理 CSRF。不能把 CORS 配置当成身份授权,也不能把藏在前端代码里的固定 API 密钥当成用户密码。
保存密码与令牌
密码由成熟认证服务使用适合密码的哈希算法和盐处理,应用不要自行设计加密口令。服务端特权密钥不进入浏览器、公开仓库或日志。访问令牌过期、刷新失败、明确退出和账号切换属于不同状态,需要停止旧请求覆盖新会话。
离线缓存必须绑定账号。网络故障时可以按规则保留同身份的待同步修改;服务端返回未登录或无权限时,应停止写入,不能静默借用另一个身份的数据。
练习与面试自查
给“读取学习进度”“更新已学”“修改站主身份”分别列出所需权限。用匿名请求、普通登录请求和正确站主请求检查响应。再测试退出后晚到的旧请求,确认不会恢复过期会话或覆盖当前状态。
解释为什么 JWT 签名有效仍不等于资源访问获准,以及 Cookie 的三个常用属性分别保护什么。