로그인부터 토큰 인증까지 OAuth 2.0과 JWT(Json Web Token)는 오늘날 웹 개발에서 빠질 수 없는 인증 기술입니다.
이 글에서는 OAuth로 소셜 로그인을 구현하고, JWT를 통해 사용자 인증을 유지하는 기본적인 흐름을 쉽게 설명해드릴게요.
OAuth 2.0이란?
OAuth 2.0은 사용자의 로그인 정보를 직접 받지 않고도 인증할 수 있도록 해주는 권한 위임 방식입니다.
예를 들어, 사용자가 “구글 로그인” 버튼을 클릭하면 구글 로그인 창으로 이동하고, 인증 후 우리 앱으로 돌아와 로그인됩니다.
구현 흐름 요약:
- 클라이언트에서 인증 요청 (ex:
구글 로그인 버튼클릭) - 사용자가 구글 로그인
- 콜백 URL로 인가 코드(authorization code) 전달
- 서버에서 이 코드를 사용해 액세스 토큰(access token) 발급
- 토큰으로 사용자 정보 요청 → 로그인 처리
JWT란?
JWT는 로그인 후 발급된 토큰으로, 사용자 정보를 안전하게 담아 전송할 수 있는 기술입니다.
이 토큰을 HTTP 요청 헤더에 넣으면 로그인 상태를 유지할 수 있습니다.
JWT 구조:
- Header: 알고리즘 정보 (예: HS256)
- Payload: 사용자 정보 (예: id, email)
- Signature: 위변조 방지용 서명
예:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
예제: Node.js + Express + JWT 로그인 구현
const jwt = require('jsonwebtoken');
// 로그인 성공 시
app.post('/login', (req, res) => {
const user = { id: 1, name: '홍길동' }; // 예시 사용자
const token = jwt.sign(user, '비밀키', { expiresIn: '1h' });
res.json({ token });
});
// 인증 필요한 요청
app.get('/profile', (req, res) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).send('인증 필요');
try {
const user = jwt.verify(token, '비밀키');
res.json(user); // 인증된 사용자 정보 반환
} catch {
res.status(403).send('토큰 유효하지 않음');
}
});
이 방식은 프론트엔드와 백엔드가 분리된 구조(SPA, React, Vue 등)에서 특히 유용합니다.
실전 팁
- 토큰 저장 위치: 브라우저에서는
localStorage보단httpOnly cookie가 보안상 안전 - 토큰 만료 시간 설정: 보안을 위해 적절한 만료 시간 필수
- Refresh Token 사용: Access Token이 만료됐을 때 재발급용으로 사용
마무리
OAuth 2.0은 외부 인증 연결, JWT는 로그인 유지와 인증 처리에 필수입니다.
둘을 잘 조합하면 사용자 경험도 향상되고, 보안도 강화됩니다.