0

0

如何安全地存储用户凭据:前端与后端协同的身份认证实践

花韻仙語

花韻仙語

发布时间:2026-02-20 19:05:12

|

309人浏览过

|

来源于php中文网

原创

如何安全地存储用户凭据:前端与后端协同的身份认证实践

本文详解用户注册与登录过程中凭据的安全处理机制,强调密码绝不可在前端加密或本地存储,而应通过 https 传输至后端,由服务端使用 bcrypt 等强哈希算法安全存储;前端仅负责持久化短期有效的身份令牌(如 jwt 或会话 cookie)。

本文详解用户注册与登录过程中凭据的安全处理机制,强调密码绝不可在前端加密或本地存储,而应通过 https 传输至后端,由服务端使用 bcrypt 等强哈希算法安全存储;前端仅负责持久化短期有效的身份令牌(如 jwt 或会话 cookie)。

在 Web 开发初学阶段,一个常见误区是试图用 localStorage 或 sessionStorage 直接保存用户名和明文/加密后的密码。这是严重不安全的做法——这些 API 仅用于客户端临时数据缓存,无法抵御 XSS 攻击,且浏览器中任何脚本均可读取其内容。真实应用中,用户凭据的存储与验证必须遵循“前端只传、后端只存”的分层原则。

狸谱App
狸谱App

AI壁纸漫画梗图,年轻人的抽象创作社区

下载

✅ 正确流程:前后端职责分离

  1. 前端(HTML/JS)仅负责采集与传输
    使用标准
    或 fetch() 发送凭证至后端 API,绝不自行加密密码(如用 CryptoJS 哈希),因为密钥暴露、算法可逆、缺乏盐值(salt)均会导致防护形同虚设。示例代码如下:
<!-- 登录表单 -->
<form id="loginForm">
  <input type="text" name="username" required placeholder="用户名" />
  <input type="password" name="password" required placeholder="密码" />
  <button type="submit">登录</button>
</form>
// 使用 fetch 安全提交(确保页面通过 HTTPS 加载)
document.getElementById('loginForm').addEventListener('submit', async (e) => {
  e.preventDefault();
  const formData = new FormData(e.target);
  const credentials = {
    username: formData.get('username'),
    password: formData.get('password')
  };

  try {
    const res = await fetch('/api/login', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(credentials)
    });

    if (res.ok) {
      const data = await res.json();
      // ✅ 安全:仅存储后端签发的短期令牌
      localStorage.setItem('authToken', data.token); // 或 sessionStorage(关闭标签页即失效)
      window.location.href = '/dashboard';
    } else {
      alert('登录失败,请检查用户名或密码');
    }
  } catch (err) {
    console.error('网络错误:', err);
  }
});
  1. 后端(如 Node.js + Express)负责核心安全逻辑
    • 接收明文密码(通过 HTTPS 保障传输机密性)
    • 使用 bcrypt(带自适应计算成本与随机 salt)进行单向哈希存储
    • 登录时比对哈希值,成功后签发 JWT 或设置 HttpOnly Cookie
// 后端伪代码(Node.js + bcryptjs)
const bcrypt = require('bcryptjs');

// 注册:密码哈希后存入数据库
app.post('/api/register', async (req, res) => {
  const { username, password } = req.body;
  const saltRounds = 12;
  const hashedPassword = await bcrypt.hash(password, saltRounds);
  await db.users.insert({ username, password: hashedPassword });
  res.status(201).json({ message: '注册成功' });
});

// 登录:比对哈希值,签发令牌
app.post('/api/login', async (req, res) => {
  const { username, password } = req.body;
  const user = await db.users.findOne({ username });
  if (user && await bcrypt.compare(password, user.password)) {
    const token = jwt.sign({ userId: user._id }, process.env.JWT_SECRET, {
      expiresIn: '24h'
    });
    res.json({ token }); // 前端存储此 token
  } else {
    res.status(401).json({ error: '用户名或密码错误' });
  }
});

⚠️ 关键注意事项

  • 禁止前端密码哈希:客户端哈希无法替代 HTTPS + 服务端强哈希,反而可能掩盖传输风险,且易被绕过。
  • 禁用 localStorage 存储密码/敏感信息:即使加密,也违背最小权限原则;若需持久化登录态,仅存后端签发的、带签名和过期时间的 JWT,并配合 HttpOnly: false(供 JS 读取)+ Secure + SameSite=Strict 属性。
  • 始终启用 HTTPS:未加密的 HTTP 会使所有传输数据(包括密码)暴露于中间人攻击。
  • 密码策略与风控:后端应强制最小长度、拒绝常见弱口令,并对高频失败登录实施限流或验证码。
  • Cookie 方案更推荐用于传统 Web 应用:后端直接设置 Set-Cookie: sessionid=xxx; HttpOnly; Secure; SameSite=Lax,浏览器自动携带,前端 JS 无法访问,天然防御 XSS 窃取。

总结

安全的身份认证不是“把密码藏起来”,而是构建可信的信任链:前端专注交互与传输,后端承担密码学责任,基础设施(HTTPS、数据库权限、服务器配置)提供底层保障。从今天起,请牢记——localStorage 是你的工具箱,不是保险柜;真正的安全,永远发生在你无法直接看到的服务器上。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

152

2026.02.10

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6472

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

362

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

434

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

524

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

434

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

594

2023.08.03

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 11.7万人学习

CSS3 教程
CSS3 教程

共18课时 | 5.9万人学习

Vue 教程
Vue 教程

共42课时 | 8.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号