>  기사  >  웹 프론트엔드  >  Node.js API 보안: 인증에 대한 간단한 가이드

Node.js API 보안: 인증에 대한 간단한 가이드

DDD
DDD원래의
2024-09-19 00:29:32874검색

Securing a Node.js API: A Simple Guide to Authentication

Node.js API를 구축했고 이를 보호하고 싶어서 선택할 수 있는 몇 가지 옵션을 확인했습니다. 그래서 세 가지 일반적인 인증 방법인 기본 인증, JWT(JSON 웹 토큰), API 키에 대해 안내해 드리겠습니다.

1. 기본 인증

그것은 무엇입니까?

기본 인증은 매우 간단합니다. 클라이언트는 Authorization 헤더에 각 요청과 함께 사용자 이름과 비밀번호를 보냅니다. 구현하기는 쉽지만 자격 증명이 base64로만 인코딩되므로(암호화되지 않음) HTTPS를 사용하지 않는 한 가장 안전하지는 않습니다.

구현 방법

Express를 사용하여 API에 기본 인증을 추가하려면 다음이 필요합니다.

  1. 기본 인증 패키지를 설치합니다.
   npm install basic-auth
  1. 인증 미들웨어 추가:
   const express = require('express');
   const basicAuth = require('basic-auth');

   const app = express();

   function auth(req, res, next) {
     const user = basicAuth(req);
     const validUser = user && user.name === 'your-username' && user.pass === 'your-password';

     if (!validUser) {
       res.set('WWW-Authenticate', 'Basic realm="example"');
       return res.status(401).send('Authentication required.');
     }
     next();
   }

   app.use(auth);

   app.get('/', (req, res) => {
     res.send('Hello, authenticated user!');
   });

   const PORT = process.env.PORT || 3000;
   app.listen(PORT, () => {
     console.log(`Server is running on port ${PORT}`);
   });

테스트하기

curl을 사용하여 기본 인증 테스트:

curl -u your-username:your-password http://localhost:3000/

팁: 자격 증명을 보호하려면 항상 HTTPS를 통한 기본 인증을 사용하세요.


2. JWT(JSON 웹 토큰)

그것은 무엇입니까?

JWT는 사용자를 인증하는 더욱 안전하고 확장 가능한 방법입니다. 모든 요청에 ​​대해 자격 증명을 보내는 대신 서버는 로그인 시 토큰을 생성합니다. 클라이언트는 후속 요청을 위해 Authorization 헤더에 이 토큰을 포함합니다.

구현 방법

먼저 필수 패키지를 설치합니다.

npm install jsonwebtoken express-jwt

JWT 인증을 설정하는 방법의 예는 다음과 같습니다.

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

const app = express();
const secret = 'your-secret-key';

// Middleware to protect routes
const jwtMiddleware = expressJwt({ secret, algorithms: ['HS256'] });

app.use(express.json()); // Parse JSON bodies

// Login route to generate JWT token
app.post('/login', (req, res) => {
  const { username, password } = req.body;

  if (username === 'user' && password === 'password') {
    const token = jwt.sign({ username }, secret, { expiresIn: '1h' });
    return res.json({ token });
  }

  return res.status(401).json({ message: 'Invalid credentials' });
});

// Protected route
app.get('/protected', jwtMiddleware, (req, res) => {
  res.send('This is a protected route. You are authenticated!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

테스트하기

먼저 로그인하여 토큰을 받으세요.

curl -X POST http://localhost:3000/login -d '{"username":"user","password":"password"}' -H "Content-Type: application/json"

그런 다음 토큰을 사용하여 보호된 경로에 액세스하세요.

curl -H "Authorization: Bearer <your-token>" http://localhost:3000/protected

JWT는 토큰에 만료 시간이 있고 각 요청마다 자격 증명을 보낼 필요가 없다는 점에서 훌륭합니다.


3. API Key 인증

그것은 무엇입니까?

API 키 인증은 간단합니다. 각 클라이언트에게 고유한 키를 제공하면 요청에 포함됩니다. 구현하기는 쉽지만 동일한 키가 계속해서 재사용되기 때문에 JWT만큼 안전하거나 유연하지는 않습니다. 결국에는 API 호출 수를 제한하는 데 쉽게 사용할 수 있는 강력한 솔루션이 있으며 많은 웹사이트에서 이를 사용하고 있습니다. 추가적인 보안 조치로 요청을 특정 IP로 제한할 수 있습니다.

구현 방법

이를 위해서는 특별한 패키지가 필요하지 않지만 dotenv를 사용하여 API 키를 관리하는 것이 좋습니다. 먼저 dotenv를 설치하세요:

npm install dotenv

그런 다음 API 키 인증을 사용하여 API를 생성하세요.

require('dotenv').config();
const express = require('express');
const app = express();

const API_KEY = process.env.API_KEY || 'your-api-key';

function checkApiKey(req, res, next) {
  const apiKey = req.query.api_key || req.headers['x-api-key'];

  if (apiKey === API_KEY) {
    next();
  } else {
    res.status(403).send('Forbidden: Invalid API Key');
  }
}

app.use(checkApiKey);

app.get('/', (req, res) => {
  res.send('Hello, authenticated user with a valid API key!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

테스트하기

다음을 사용하여 API 키 인증을 테스트할 수 있습니다.

curl http://localhost:3000/?api_key=your-api-key

또는 맞춤 헤더 사용:

curl -H "x-api-key: your-api-key" http://localhost:3000/

인증 방법 요약

  • 기본 인증:

    • 장점: 설정이 쉽습니다.
    • 단점: 요청이 있을 때마다 자격 증명이 전송되므로 HTTPS를 통해 사용해야 합니다.
    • 사용 사례: 소수의 사용자를 위한 간단한 API
  • JWT 인증:

    • 장점: 안전하고 상태 비저장이며 확장성이 뛰어납니다.
    • 단점: 기본 인증보다 복잡합니다.
    • 사용 사례: 강력한 보안이 필요한 확장 가능한 API
  • API 키 인증:

    • 장점: 간단하고 널리 사용됩니다.
    • 단점: API 키는 JWT에 비해 보안 수준이 낮고 관리하기가 더 어렵습니다.
    • 사용 사례: 사용자 관리 없이 클라이언트를 인증하려는 간단한 API

결론

빠르고 쉬운 방법을 찾고 있다면 기본 인증이 효과적일 수 있지만 HTTPS를 사용하는 것을 잊지 마세요. 더욱 강력하고 확장 가능한 보안을 원한다면 JWT를 선택하세요. 경량 또는 내부 API의 경우 API Key 인증만으로 충분할 수 있습니다.

어떤 인증 방법을 사용할 예정이거나 다른 솔루션이 있나요? 댓글로 알려주세요!

위 내용은 Node.js API 보안: 인증에 대한 간단한 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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