>  기사  >  웹 프론트엔드  >  토큰 위조 및 데이터 조작 공격으로부터 JWT 토큰을 보호하세요

토큰 위조 및 데이터 조작 공격으로부터 JWT 토큰을 보호하세요

王林
王林원래의
2024-07-20 15:15:37668검색

Protect JWT Token from Token Forgery and Data Manipulation Attack

소개:

JSON 웹 토큰(JWT)은 API 인증 및 데이터 교환 보안을 위해 널리 사용됩니다. 그러나 부적절한 구현 및 처리로 인해 토큰 위조 및 데이터 조작으로 이어지는 취약점이 노출될 수 있습니다. 이 블로그에서는 일반적인 JWT 약점, 실제 공격 사례, 이러한 위험을 완화하기 위한 모범 사례를 살펴보겠습니다.

JWT란 무엇입니까?

JWT는 두 당사자 간에 전송될 소유권 주장을 표현하는 URL 안전의 컴팩트한 수단입니다. Base64로 인코딩된 헤더, 페이로드, 서명의 세 부분으로 구성됩니다.

JWT 구조:

{
  "header": {
    "alg": "HS256",
    "typ": "JWT"
  },
  "payload": {
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
  },
  "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}

일반적인 JWT 취약점:

1. 알고리즘 혼란 공격:
공격자는 취약한 알고리즘을 악용하거나 토큰 헤더의 알고리즘을 없음으로 변경하여 토큰 위조로 이어질 수 있습니다.

예:

{
  "alg": "none",
  "typ": "JWT"
}

완화:
항상 서버 측에서 alg 매개변수의 유효성을 검사하고 "없음" 또는 약한 알고리즘이 있는 토큰을 거부하세요.

안전한 구현:

const jwt = require('jsonwebtoken');
const payload = {
  sub: "1234567890",
  name: "John Doe"
};
const secret = 'your-256-bit-secret';
const token = jwt.sign(payload, secret, { algorithm: 'HS256' });

jwt.verify(token, secret, { algorithms: ['HS256'] }, function(err, decoded) {
  if (err) throw new Error('Token verification failed');
  console.log(decoded);
});

2. 키 주입 공격:
공격자는 새 키를 포함하도록 페이로드를 조작하여 무단 액세스로 이어질 수 있습니다.

예:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

완화:
주장이 제대로 검증되었는지, 민감한 정보가 페이로드에 저장되지 않았는지 확인하세요.

안전한 구현:

const payload = {
  sub: "1234567890",
  name: "John Doe"
};

const token = jwt.sign(payload, secret, { algorithm: 'HS256' });

jwt.verify(token, secret, function(err, decoded) {
  if (err) throw new Error('Token verification failed');
  if (decoded.admin) throw new Error('Unauthorized access');
  console.log(decoded);
});

3. 취약한 비밀 키:
약하거나 예측 가능한 비밀 키를 사용하면 무차별 공격이 발생할 수 있습니다.

완화:
강력하고 무작위로 생성된 비밀 키를 사용하고 정기적으로 교체하세요.

안전한 구현:

const crypto = require('crypto');
const secret = crypto.randomBytes(64).toString('hex');

const token = jwt.sign(payload, secret, { algorithm: 'HS256' });

jwt.verify(token, secret, function(err, decoded) {
  if (err) throw new Error('Token verification failed');
  console.log(decoded);
});

완전한 보안 JWT 구현 예:

다음은 Node.js 애플리케이션에서 JWT를 안전하게 구현하는 방법에 대한 전체 예입니다.

1단계: 종속성 설치

npm install jsonwebtoken express body-parser

2단계: 간단한 서버 만들기

const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const crypto = require('crypto');

const app = express();
app.use(bodyParser.json());

const secret = crypto.randomBytes(64).toString('hex');

app.post('/login', (req, res) => {
  const { username, password } = req.body;

  // Authenticate user (dummy check for example)
  if (username === 'user' && password === 'pass') {
    const payload = { username };
    const token = jwt.sign(payload, secret, { algorithm: 'HS256', expiresIn: '1h' });
    res.json({ token });
  } else {
    res.status(401).json({ message: 'Invalid credentials' });
  }
});

app.get('/protected', (req, res) => {
  const token = req.headers['authorization'];

  if (!token) return res.status(403).json({ message: 'No token provided' });

  jwt.verify(token, secret, { algorithms: ['HS256'] }, (err, decoded) => {
    if (err) return res.status(500).json({ message: 'Failed to authenticate token' });

    res.json({ message: 'Access granted', user: decoded });
  });
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

보안 JWT 구현 모범 사례:

  • 강력한 알고리즘 사용: 보안을 강화하려면 HS256보다 RS256 또는 ES256을 선호하세요.
  • 토큰 만료 유효성 검사: 항상 exp 클레임을 확인하여 토큰이 만료되지 않았는지 확인하세요.
  • 비밀을 안전하게 저장: 환경 변수 또는 보안 저장소와 같은 안전한 위치에 비밀 키를 보관하세요.
  • 적절한 오류 처리 구현: 공격자에게 도움이 될 수 있는 민감한 오류 메시지를 노출하지 마세요.
  • HTTPS 사용: 토큰 가로채기를 방지하려면 모든 통신이 HTTPS를 통해 이루어져야 합니다.

결론:

애플리케이션 보안을 유지하려면 JWT 취약점을 이해하고 완화하는 것이 중요합니다. 모범 사례를 따르고 JWT를 적절하게 처리하면 토큰 위조 및 데이터 조작을 방지하고 강력한 API 보안을 보장할 수 있습니다.

JWT 취약점으로부터 보호하기 위한 모범 사례를 구현하여 지금 API를 보호하세요!

위 내용은 토큰 위조 및 데이터 조작 공격으로부터 JWT 토큰을 보호하세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.