티스토리 뷰
JWT (JSON Web Token)를 사용한 로그인 인증은 클라이언트와 서버 간에 상태를 유지하지 않는 상태에서도 사용자를 인증하는 방법입니다. 이 방식은 HTTP 헤더에 JWT를 포함시켜 서버에 전송하고, 서버는 이 토큰을 검증하여 사용자를 인증하는 방식으로 동작합니다.
Node.js에서는 'jsonwebtoken' 및 'express-jwt' 모듈을 사용하여 JWT를 구현할 수 있습니다. 'jsonwebtoken' 모듈은 JWT를 생성하고 검증하는 데 사용되며, 'express-jwt' 모듈은 Express 미들웨어로서 JWT를 검증하는 데 사용됩니다.
먼저, JWT를 생성하는 로그인 라우트를 만들어 봅시다. 이 예제에서는 단순화를 위해 실제 사용자 인증 과정을 생략하겠습니다:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
app.post('/login', (req, res) => {
// In a real application, you'd usually verify the login details here
const user = { id: 1, username: 'testuser' };
jwt.sign(user, 'your_jwt_secret', { expiresIn: '1h' }, (err, token) => {
if (err) {
res.sendStatus(500);
return;
}
res.json({ token });
});
});
app.listen(3000, () => console.log('Server started on port 3000'));
이 코드에서는 '/login' 라우트에서 사용자 인증을 수행하고, 사용자 정보를 포함하는 JWT를 생성합니다. JWT에는 'id' 및 'username'이 포함되어 있습니다. 토큰은 'your_jwt_secret'라는 시크릿 키로 서명되며, 1시간 후에 만료됩니다.
다음으로, 'express-jwt' 미들웨어를 사용하여 특정 라우트에 대한 접근을 제한하고 사용자를 인증할 수 있습니다. 이 미들웨어는 HTTP 요청 헤더의 'Authorization' 필드에서 JWT를 찾아 검증합니다:
const express = require('express');
const jwt = require('jsonwebtoken');
const expressJwt = require('express-jwt');
const app = express();
app.use(express.json());
// ...
app.use(expressJwt({ secret: 'your_jwt_secret', algorithms: ['HS256'] }));
app.get('/protected', (req, res) => {
res.json({ message: 'This is a protected route', user: req.user });
});
app.listen(3000, () => console.log('Server started on port 3000'));
이 코드에서는 'expressJwt' 미들웨어를 애플리케이션 레벨 미들웨어로 추가하여 모든 라우트에 대한 인증을 요구합니다. 'expressJwt' 함수는 JWT를 검증하는 데 사용되는 시크릿 키를 인자로 받습니다.
'/protected' 라우트는 이제 JWT 인증을 요구합니다. 클라이언트는 이 라우트에 접근하기 위해서는 'Authorization' 헤더에 유효한 JWT를 포함시켜야 합니다. JWT가 유효하다면, JWT의 페이로드는 'req.user'에 할당되며, 이 페이로드는 라우트 핸들러에서 사용할 수 있습니다.
JWT 기반 인증은 상태를 유지하지 않는 웹 애플리케이션에서 강력하고 유연한 인증 방법을 제공합니다. 그러나 JWT를 사용할 때는 보안에 유의해야 합니다. 특히, 시크릿 키는 절대로 외부에 노출되어서는 안되며, HTTPS를 사용하여 JWT를 전송해야 합니다. 또한, JWT의 만료 시간을 적절히 설정하여, 만약 토큰이 노출되더라도 피해를 최소화하는 것이 중요합니다.
'개발' 카테고리의 다른 글
NodeJS에서 CORS(Cross Origin Resource Sharing)이용 (0) | 2023.07.04 |
---|---|
JWT 갱신 토큰과 Sliding Session을 활용한 보안 전략 (0) | 2023.07.04 |
Redis를 사용한 JWT 갱신 토큰 관리방법 (2) | 2023.07.04 |
[개발]JWT 갱신 토큰 관리 방법(7)- 로컬스토리지/쿠키 구현 (0) | 2023.07.03 |
[개발]JWT 갱신 토큰 관리방법(6)-블랙리스트 구현 (0) | 2023.07.03 |