讲师中心 微信公众号
AI工具推荐 视频效率加速

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

阿辰吖_1210

阿辰吖_1210

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

|

429人浏览过

|

来源于php中文网

原创

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

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

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

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

前端设计优化skill
前端设计优化skill

前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。

下载

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

  1. 前端(HTML/JS)仅负责采集与传输
    使用标准 <form> 或 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工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

761

2026.02.10

cookie
cookie

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

12039

2023.06.30

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

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

1166

2023.11.23

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

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

824

2024.02.23

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

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

1906

2025.08.19

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

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

4456

2023.06.20

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

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

1355

2023.07.28

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

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

1778

2023.08.03

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn