하이브리드 토큰 저장 방식
저장 위치
Access Token → localStorage (또는 메모리)
Refresh Token → HttpOnly Cookie
왜 이렇게 나눠서 저장할까?
1. 각 토큰의 특성이 다르기 때문
| 토큰 | 유효기간 | 사용 빈도 | 중요도 |
|---|---|---|---|
| Access Token | 짧음 (15분~1시간) | 매 API 요청마다 | 탈취되어도 피해 제한적 |
| Refresh Token | 김 (7일~30일) | Access Token 만료 시만 | 탈취 시 장기간 피해 |
2. 보안과 편의성의 균형
javascript
// 일반 API 요청
axios.get('/api/user/profile', {
headers: {
Authorization: `Bearer ${localStorage.getItem('accessToken')}`
}
});
// Access Token 만료 시 갱신 (자동)
axios.post('/api/auth/refresh');
// Refresh Token은 HttpOnly 쿠키로 자동 전송됨
// 백엔드에서 새 Access Token 발급
```
### 전략별 비교
#### ❌ **둘 다 localStorage**
```
Access Token → localStorage
Refresh Token → localStorage
```
- **문제점**: Refresh Token이 탈취되면 장기간 피해
- XSS 공격으로 두 토큰 모두 탈취 → 최악의 시나리오
#### ❌ **둘 다 HttpOnly Cookie**
```
Access Token → HttpOnly Cookie
Refresh Token → HttpOnly Cookie
```
- **문제점**:
- CSRF 공격에 취약 (모든 요청에 자동 포함)
- JavaScript로 토큰 접근 불가 → 토큰 상태 확인 어려움
- SPA에서 토큰 만료 체크가 복잡해짐
#### ✅ **하이브리드 방식 (가장 많이 사용)**
```
Access Token → localStorage
Refresh Token → HttpOnly Cookie- 장점:와
- XSS로 Access Token 탈취되어도 → 15분 후 무용지물
- Refresh Token은 HttpOnly라 JavaScript로 접근 불가 → XSS에 안전
- Refresh Token은 특정 엔드포인트(
/refresh)에만 전송 → CSRF 위험 최소화
실제 플로우
javascript
// 1. 로그인 성공
// 백엔드 응답:
{
accessToken: "eyJhbGc...", // → localStorage 저장
// refreshToken은 Set-Cookie 헤더로 HttpOnly 쿠키 설정
}
// 2. 일반 API 요청 (Axios Interceptor)
axios.interceptors.request.use(config => {
const token = localStorage.getItem('accessToken');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// 3. Access Token 만료 시 자동 갱신
axios.interceptors.response.use(
response => response,
async error => {
if (error.response?.status === 401) {
// Refresh Token으로 새 Access Token 발급
const { data } = await axios.post('/api/auth/refresh');
// Refresh Token은 자동으로 쿠키로 전송됨
localStorage.setItem('accessToken', data.accessToken);
// 실패한 요청 재시도
return axios(error.config);
}
}
);현업에서는?
대기업/보안 중요 서비스
- 하이브리드 방식 압도적으로 선호
- 예: Google, Facebook, GitHub
스타트업/초기 프로젝트
- 개발 속도 우선 → 둘 다 localStorage로 시작
- 나중에 하이브리드로 마이그레이션
PR 문서에는 이렇게 쓰면 좋을 것 같아요
markdown
3. LocalStorage 방식의 토큰 저장
* 현재 구현
- Access Token만 사용 중이며 localStorage에 저장
* 추후 개선 계획
- Refresh Token 도입 시 **하이브리드 방식** 적용 예정:
- Access Token (짧은 유효기간) → localStorage
- Refresh Token (긴 유효기간) → HttpOnly Cookie
- 이를 통해 XSS 공격 시 피해를 Access Token 유효기간 내로 제한답변: 네, 이 방식 많이 씁니다! 보안(Refresh Token 보호)과 편의성(Access Token 접근성)의 균형을 맞춘 방식이에요.