JWT(JSON Web Token)는 클라이언트와 서버간에 정보를 안전하게 전달하기 위한 방법입니다. JWT는 상태를 유지하지 않는 Stateless한 특성을 가지고 있어, 확장성 있는 시스템을 구축하는 데 매우 유용합니다. 하지만, JWT는 만료 시간이 있어 주기적으로 갱신해야 합니다.
1. 필요한 모듈 설치하기
npm install express jsonwebtoken body-parser
2. JWT 생성하기
로그인 요청이 들어오면, 서버는 클라이언트에게 JWT를 발급하기 위해 'jsonwebtoken' 모듈의 'sign' 메소드를 사용하여 JWT를 생성
app.post('/login', (req, res) => {
const user = {
id: 1,
username: 'test',
};
const token = jwt.sign(user, 'your_secret_key', { expiresIn: '1h' });
res.json({ token });
});
3. JWT 검증하기
서버는 클라이언트가 보낸 JWT의 유효성 검사하기 위해 'jsonwebtoken' 모듈의 'verify' 메소드를 사용
app.get('/protected', (req, res) => {
// request 헤더에서 authorization bearer 토큰 받기
const token = req.headers["authorization"]?.split(" ")[1];
if (!token) {
return res.status(401).json({ error: 'No token provided' });
}
// 정상적인 토큰인지 확인
jwt.verify(token, 'your_secret_key', (err, user) => {
if (err) {
return res.status(401).json({ error: 'Token is not valid' });
}
req.user = user;
res.json({user: user, message: 'Protected data' });
});
});
4. 리프레시 토큰 생성하기
리프레시 토큰 : 액세스 토큰이 만료되었을 때 사용자의 세션을 유지하기 위한 토큰
액세스 토큰이 만료되면, 클라이언트는 리프레시 토큰을 사용하여 토큰을 요청하면 서버는 새로운 액세스 토큰을 생성하여 반환
app.post('/token', (req, res) => {
const refreshToken = req.body.token;
console.log(refreshToken)
if (!refreshToken) {
return res.status(401).json({ error: 'No token provided' });
}
// 기존 토큰의 유효성 검사
jwt.verify(refreshToken, 'your_secret_key', (err, user) => {
console.log(user)
if (err) {
return res.status(403).json({ error: 'Token is not valid' });
}
// 새로운 페이로드 생성
const payload = {
id: 2,
username: user.username,
};
const newToken = jwt.sign(payload, 'your_secret_key', { expiresIn: '1h' });
res.json({ newToken });
});
});
5. 토큰 삭제하기
로그아웃 요청이 들어오면, 서버는 클라이언트의 JWT를 무효화
app.get('/logout', (req, res) => {
const token = req.headers["authorization"]?.split(" ")[1];
console.log(token)
if (!token) {
return res.status(401).json({ error: 'No token provided' });
}
// 토큰 무효화
const decoded = jwt.decode(token);
if (!decoded) {
return res.status(403).json({ error: 'Token is not valid' });
}
res.json({ message: 'good Bye!' });
});
사용자 인증과 세션 관리를 효과적으로 수행할 수 있는 JWT는 HTTP 헤더에 포함되어 서버와 클라이언트 사이에 안전하게 전달될 수 있습니다.
반응형
'개발정리 (nodeJS)' 카테고리의 다른 글
[nodeJS] Node.js로 자연어 처리하기 (0) | 2024.05.03 |
---|---|
[nodeJS] nodeJS에서 console.log 사용하지 않고 디버깅하기 (0) | 2024.03.25 |
[nodeJS] fs 모듈을 이용하여 다중 폴더 생성하기 (0) | 2023.12.30 |
[nodeJS] node 버전 변경하기 (nvm) (0) | 2023.11.30 |
[nodeJS] html-escaper 모듈을 이용하여 HTML 이스케이프 문자 파싱하기 (0) | 2023.11.11 |