반응형
현대적인 RESTful API에서는 **JWT(JSON Web Token)**를 사용해 사용자 인증을 구현하는 것이 일반적입니다. 이번 글에서는 Express API에 JWT를 사용해 로그인 기능을 구현하고, 보호된 라우트를 설정하는 방법을 배워보겠습니다.
1. JWT란 무엇인가?
JWT는 JSON 데이터를 기반으로 한 토큰 형식으로, 클라이언트와 서버 간의 신뢰성을 유지하며 인증 정보를 전달하는 데 사용됩니다.
JWT 구조
JWT는 크게 3가지로 구성됩니다:
- Header: 토큰 유형과 알고리즘 정보.
- Payload: 사용자 정보(예: id, email)를 포함.
- Signature: 비밀키로 서명하여 데이터 무결성 보장.
예시 JWT:
text
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsImVtYWlsIjoiam9obkBleGFtcGxlLmNvbSIsImlhdCI6MTY3MTM1MjYyMX0.KzZVgS2L3kJtGzWY9D1f3ShV7A91ZhdC82Iq6D-LPBM
2. JWT 설치 및 설정
1) jsonwebtoken 설치
JWT를 생성하고 검증하기 위해 jsonwebtoken 라이브러리를 설치합니다.
bash
npm install jsonwebtoken
2) 비밀키 설정
토큰의 무결성을 검증하기 위한 비밀키를 설정합니다. 환경 변수로 관리하는 것이 안전합니다.
.env 파일:
env
JWT_SECRET=your_secret_key
JWT_EXPIRES_IN=1h
server.js에서 dotenv 패키지를 사용하여 환경 변수를 로드:
javascript
require('dotenv').config();
const jwtSecret = process.env.JWT_SECRET;
3. 로그인 API에 JWT 발급 추가
1) 로그인 API 생성
사용자가 로그인을 요청하면, ID와 비밀번호를 확인하고 JWT를 생성해 반환합니다.
javascript
jconst jwt = require('jsonwebtoken');
// 로그인 라우트
app.post('/login', async (req, res) => {
const { email, password } = req.body;
// 예시: 사용자 인증 (실제 구현 시 데이터베이스 확인 필요)
const user = { id: 1, email: email }; // 가짜 사용자 데이터
if (password === '123456') { // 예제용 비밀번호 검증
const token = jwt.sign(
{ userId: user.id, email: user.email },
jwtSecret,
{ expiresIn: '1h' }
);
return res.json({ token });
} else {
return res.status(401).json({ error: '인증 실패' });
}
});
// 로그인 라우트
app.post('/login', async (req, res) => {
const { email, password } = req.body;
// 예시: 사용자 인증 (실제 구현 시 데이터베이스 확인 필요)
const user = { id: 1, email: email }; // 가짜 사용자 데이터
if (password === '123456') { // 예제용 비밀번호 검증
const token = jwt.sign(
{ userId: user.id, email: user.email },
jwtSecret,
{ expiresIn: '1h' }
);
return res.json({ token });
} else {
return res.status(401).json({ error: '인증 실패' });
}
});
4. JWT 인증 미들웨어
1) 인증 미들웨어 생성
JWT를 검증하는 미들웨어를 만들어 보호된 라우트에서 사용합니다.
javascript
const authenticateToken = (req, res, next) => {
const token = req.headers['authorization']?.split(' ')[1]; // 'Bearer TOKEN' 형식
if (!token) return res.status(401).json({ error: '토큰이 필요합니다.' });
jwt.verify(token, jwtSecret, (err, user) => {
if (err) return res.status(403).json({ error: '유효하지 않은 토큰입니다.' });
req.user = user;
next();
});
};
const token = req.headers['authorization']?.split(' ')[1]; // 'Bearer TOKEN' 형식
if (!token) return res.status(401).json({ error: '토큰이 필요합니다.' });
jwt.verify(token, jwtSecret, (err, user) => {
if (err) return res.status(403).json({ error: '유효하지 않은 토큰입니다.' });
req.user = user;
next();
});
};
5. 보호된 라우트 생성
1) 인증된 사용자만 접근 가능하도록 설정
미들웨어를 사용하여 특정 라우트를 보호합니다.
javascript
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: '보호된 데이터에 접근했습니다.', user: req.user });
});
res.json({ message: '보호된 데이터에 접근했습니다.', user: req.user });
});
6. Postman으로 테스트
- 로그인 요청:
- POST /login으로 이메일과 비밀번호 전송.
- 응답에서 JWT를 확인.
- 보호된 라우트 접근:
- GET /protected 요청 시, Authorization 헤더에 Bearer TOKEN 형식으로 JWT 추가.
7. 결론
JWT를 사용하여 인증 기능을 구현하면 RESTful API의 보안과 확장성을 강화할 수 있습니다. 더 나아가 다음 기능을 추가해보세요:
- Refresh Token: 세션 유지를 위한 Refresh Token 발급.
- Role-based Access Control: 관리자와 일반 사용자를 구분하여 권한 부여.
다음 글에서는 Refresh Token을 활용해 세션을 유지하고 만료된 Access Token을 갱신하는 방법을 다룰 예정입니다. 많은 관심 부탁드립니다!
반응형
'프로그램 관련 > Web Development' 카테고리의 다른 글
IT개발자 (0) | 2025.01.08 |
---|---|
Azure App Service를 활용한 웹 애플리케이션 배포 가이드 (0) | 2024.12.31 |
Microsoft Azure 서비스 (0) | 2024.12.30 |
MongoDB와 Express를 연동하여 RESTful API 확장하기 (1) | 2024.12.28 |
Node.js와 Express로 간단한 RESTful API 구축하기 (0) | 2024.12.26 |