JWT(JSON Web Token)는 웹 애플리케이션에서 사용자 인증과 권한 부여를 위해 널리 사용되는 토큰 기반 인증 방식입니다.
JWT는 서버와 클라이언트 간의 안전한 정보 전달을 가능하게 하며, 토큰 자체에 필요한 정보를 포함하여 사용자 식별 및 권한 확인을 수행합니다.
1. jsonwebtoken 모듈 설치하기
npm install jsonwebtoken
2. JWT 토큰 생성하기
jwt.sign() 함수를 사용하여 토큰 생성
첫 번째 인자로 토큰에 포함될 데이터(payload)를 전달하고, 두 번째 인자로 시크릿 키를 전달
시크릿 키는 서버와 클라이언트 간에 공유되어야 하며, 토큰의 유효성 검사에 사용
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
// 시크릿 키 설정 (임의로 지정)
const secretKey = 'mysecretkey';
app.get('/login', (req, res) => {
// 사용자 로그인 처리 후 유저 정보 가져오기
// 유저 정보로부터 JWT 토큰 생성
const token = jwt.sign({ userId: user.id }, secretKey);
res.json({ token });
});
// 라우트 정의 및 인증 처리 로직 작성
app.listen(3000, () => {
console.log('서버가 3000번 포트에서 실행 중입니다.');
});
3. JWT 토큰 검증하기
클라이언트는 요청의 Authorization 헤더에 Bearer <token> 형식으로 JWT 토큰 전달 필요
서버는 받은 토큰을 jwt.verify() 함수를 사용하여 유효성 검사
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
// 시크릿 키 설정 (임의로 지정)
const secretKey = 'mysecretkey';
app.get('/protected', (req, res) => {
// 클라이언트로부터 받은 JWT 토큰
const token = req.headers.authorization.split(' ')[1];
// 토큰 유효성 검사
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
return res.status(401).json({ message: '유효하지 않은 토큰' });
}
// 유저 정보를 활용한 추가적인 처리 로직
res.json({ message: '인증 성공' });
});
});
// 라우트 정의 및 인증 처리 로직 작성
app.listen(3000, () => {
console.log('서버가 3000번 포트에서 실행 중입니다.');
});
4. JWT 토큰의 유효 기간 설정하기
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
// 시크릿 키 설정 (임의로 지정)
const secretKey = 'mysecretkey';
app.get('/login', (req, res) => {
// 사용자 로그인 처리 후 유저 정보 가져오기
// JWT 토큰 생성 및 유효 기간 설정 (30분)
const token = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '30m' });
res.json({ token });
});
// 라우트 정의 및 인증 처리 로직 작성
app.listen(3000, () => {
console.log('서버가 3000번 포트에서 실행 중입니다.');
});
토큰이 만료되면 클라이언트는 새로운 토큰을 요청해야 합니다.
서버에서는 만료된 토큰에 대해 검증 시 에러를 반환하거나, 클라이언트에게 토큰 갱신을 알리는 방법을 선택할 수 있습니다.
토큰의 유효 기간은 보안과 성능 사이의 균형을 맞추어 설정해야 합니다.
너무 짧은 유효 기간은 사용자 경험을 저하시킬 수 있고, 너무 긴 유효 기간은 토큰이 탈취되었을 때 보안 위험에 노출될 수 있습니다.
적절한 유효 기간 설정은 애플리케이션의 요구사항과 보안 정책에 따라 결정되어야 합니다.
반응형
'개발정리 (nodeJS)' 카테고리의 다른 글
[nodeJS] html-escaper 모듈을 이용하여 HTML 이스케이프 문자 파싱하기 (0) | 2023.11.11 |
---|---|
[nodeJS] Puppeteer로 간단한 검색 웹 매크로 만들기 (0) | 2023.09.09 |
[nodeJS] Node.JS 서버의 사용량 제한 구현하기 (0) | 2023.08.30 |
[nodeJS] Node.JS 서버에 CORS 허용 설정하기 (0) | 2023.08.29 |
[nodeJS] Node.JS와 mongoDB 연동 방법 (0) | 2023.08.08 |