JWT与Cookie鉴权方法详解

1,243 阅读3分钟

Web 开发中,鉴权 (Authentication) 是一个核心功能,它确保了用户数据的安全性和访问控制的有效性。在众多鉴权方法中,JSON Web Tokens(JWT) 和传统的 Cookie-Session 机制是最常用的两种。本文将详细介绍这两种鉴权方法的完整流程,并结合代码示例进行比较,探讨其优劣势及适用场景。

1. JWT鉴权流程

  1. 用户登录: 用户提交用户名和密码到服务器。

  2. 服务器验证: 服务器验证用户名和密码。

  3. 生成JWT: 验证成功后,服务器生成一个JWT,该Token包含了用户的标识信息,并通过密钥进行签名。

  4. 返回JWT: 服务器将JWT返回给客户端。

  5. 客户端存储JWT: 客户端收到JWT后,通常将其存储在LocalStorage或SessionStorage中。

  6. 请求携带JWT: 客户端在后续的每次请求中,都会在HTTP请求头(通常是Authorization字段)中携带JWT。

  7. 服务器验证JWT: 服务器收到请求后,验证JWT的有效性,包括签名、过期时间等。

  8. 处理请求: 验证通过后,服务器处理请求并返回响应。

代码示例(Node.js):

const jwt = require('jsonwebtoken');

// 生成JWT
const token = jwt.sign({ userId: user.id }, 'secretKey', { expiresIn: '1h' });

// 验证JWT
jwt.verify(token, 'secretKey', (err, decoded) => {
  if (err) {
    // 处理错误
  } else {
    // 处理请求
  }
});

2. Cookie-Session鉴权流程

  1. 用户登录: 用户提交用户名和密码到服务器。

  2. 服务器验证: 服务器验证用户名和密码。

  3. 创建Session: 验证成功后,服务器创建一个Session,并将Session ID发送给客户端。

  4. 客户端存储Session ID: 客户端收到Session ID后,通常将其存储在Cookie中。

  5. 请求携带Cookie: 客户端在后续的每次请求中,都会自动在HTTP请求头中携带Cookie。

  6. 服务器验证Session ID: 服务器收到请求后,通过Cookie中的Session ID查找对应的Session。

  7. 处理请求: 验证通过后,服务器处理请求并返回响应。

代码示例(Node.js):

const express = require('express');
const session = require('express-session');

const app = express();

app.use(session({
  secret: 'secretKey',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}));

app.post('/login', (req, res) => {
  // 验证用户名和密码
  // ...
  
  // 设置Session
  req.session.userId = user.id;
  res.send('Login successful');
});

app.get('/data', (req, res) => {
  if (req.session.userId) {
    // 处理请求
  } else {
    res.send('Unauthorized');
  }
});

3. JWT与Cookie-Session的优劣势及适用场景

  • JWT的优势

    • 无状态:服务器不需要存储Token,减少了服务器的存储压力。
    • 跨域支持:JWT可以很容易地在不同的域之间共享。
  • JWT的劣势

    • Token长度较长,可能占用较多的网络带宽。
    • Token一旦签发,就无法在服务端废除,直到过期。
  • Cookie-Session的优势

    • 安全性较高:可以通过设置Cookie的HttpOnly和Secure属性增强安全性。
    • 服务端可以控制Session的失效。
  • Cookie-Session的劣势

    • 服务端需要存储Session信息,增加了服务器的存储压力。
    • 不支持跨域共享Session。

适用场景

  • JWT适合用于分布式系统、微服务架构和需要跨域认证的场景。
  • Cookie-Session适合用于传统的单体应用,以及对安全性要求较高的场景。

因此,JWT和Cookie-Session各有其优势和适用场景。在实际开发中,应根据具体需求和系统架构选择合适的鉴权方法。

4. 对比表格

JWTCookie-Session
存储位置客户端(LocalStorage、SessionStorage)客户端(Cookie)+ 服务器端
状态管理无状态(服务器不存储Token)有状态(服务器存储Session)
跨域支持支持不支持(默认)
安全性较高(可通过签名和过期时间控制)较高(可通过HttpOnly、Secure等属性增强)
Token/Session ID长度较长较短
网络带宽占用较多(Token较长)较少(仅传输Session ID)
服务端控制较弱(一旦签发,无法废除)较强(服务端可随时废除Session)
适用场景分布式系统、微服务架构、跨域认证传统单体应用、对安全性要求较高