返回

实践前后端token验证,保障网络安全

前端

在网络安全中掌握身份验证:一个前后端 Token 验证系统的分步指南

前言

在现代的网络世界中,保障用户身份和数据安全至关重要。令牌验证是一种广泛使用的安全机制,可帮助服务器验证客户端的身份,并授予他们访问特定资源的权限。

构建一个 Token 验证系统

为了深入了解 Token 验证,我们将分步构建一个完整的前后端系统,使用流行的 JSON Web Token (JWT) 格式。

后端

1. 安装依赖

npm install express jsonwebtoken

2. 创建服务器

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();
const port = 3000;

app.post('/login', (req, res) => {
  // 模拟用户验证
  if (req.body.username === 'admin' && req.body.password === 'password') {
    // 颁发 JWT 令牌
    const token = jwt.sign({ username: 'admin' }, 'my-secret-key');
    res.json({ token });
  } else {
    res.status(401).json({ error: 'Invalid credentials' });
  }
});

app.get('/protected', (req, res) => {
  // 从请求头中获取令牌
  const token = req.headers['authorization'];

  // 验证令牌
  jwt.verify(token, 'my-secret-key', (err, decoded) => {
    if (err) {
      res.status(401).json({ error: 'Invalid token' });
    } else {
      res.json({ message: 'Hello, ' + decoded.username });
    }
  });
});

app.listen(port);

前端

1. 安装依赖

npm install jwt-decode

2. 创建登录页面

<form id="login-form">
  <input type="text" name="username" placeholder="Username">
  <input type="password" name="password" placeholder="Password">
  <button type="submit">Login</button>
</form>

3. 创建登录脚本

const loginForm = document.getElementById('login-form');

loginForm.addEventListener('submit', (event) => {
  event.preventDefault();

  // 发送登录请求,获取令牌
  fetch('http://localhost:3000/login', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      username: event.target.querySelector('input[name="username"]').value,
      password: event.target.querySelector('input[name="password"]').value
    })
  })
  .then(res => res.json())
  .then(data => {
    // 存储令牌,并跳转到受保护页面
    localStorage.setItem('token', data.token);
    window.location.href = '/protected';
  })
  .catch(err => {
    alert('Login failed');
  });
});

4. 创建受保护页面

<h1>Hello, world!</h1>

5. 创建验证脚本

// 获取令牌
const token = localStorage.getItem('token');

// 验证令牌
jwt.verify(token, 'my-secret-key', (err, decoded) => {
  if (err) {
    // 跳转到登录页面
    window.location.href = '/login';
  } else {
    // 访问受保护页面
    console.log('Hello, ' + decoded.username);
  }
});

结论

通过遵循这些步骤,我们构建了一个完整的 Token 验证系统,它保护用户身份并控制对受保护资源的访问。

常见问题解答

1. JWT 的优势是什么?

  • 易于使用:JWT 是一种简单的机制,易于实现和集成到现有系统中。
  • 安全:JWT 使用数字签名来确保令牌的完整性和真实性。
  • 跨平台:JWT 是跨平台的,可在不同的语言和环境中使用。

2. 如何存储 JWT 令牌?

  • HTTP 请求头:将令牌作为 "Authorization" 头的一部分存储在请求头中。
  • 本地存储:将令牌存储在浏览器的本地存储中,以便在会话期间使用。
  • Cookie:将令牌作为加密 cookie 存储在客户端的计算机中。

3. 如何刷新过期的 JWT 令牌?

  • 使用刷新令牌:使用刷新令牌生成新的访问令牌,从而无需重新登录。
  • 过期时间:设置一个合理的令牌过期时间,以保持安全并防止滥用。

4. 如何避免 JWT 攻击?

  • 使用强密钥:使用强密钥来保护 JWT 签名,防止伪造和篡改。
  • 验证受众:确保 JWT 仅由预期受众使用,以防止跨站点请求伪造攻击。
  • 检查过期时间:始终验证令牌的过期时间,以防止使用过期的令牌。

5. 如何保护 Token 验证系统的安全?

  • 实现基于角色的访问控制:根据用户角色授予对受保护资源的访问权限。
  • 使用双重身份验证:要求额外的身份验证因素,例如一次性密码,以增强安全性。
  • 监控可疑活动:监视系统活动,识别可疑行为和潜在攻击。