액세스 토큰을 어디에 저장할지 선택하는 것은 보안과 사용성을 균형 있게 고려해야 하는 문제다. 각각의 저장 방식에 장단점이 있으므로, 애플리케이션의 특성과 보안 요구사항에 따라 결정하는 것이 중요하다.
저장 위치 | 보안성 | 사용성 | XSS 위험 | CSRF 위험 |
---|---|---|---|---|
메모리 (변수/상태 관리) | ✅ 높음 | ❌ 새로고침 시 사라짐 | ✅ 없음 | ✅ 없음 |
HTTP-Only 쿠키 | ✅ 높음 | ✅ 자동 전송 | ✅ 없음 | ❌ 있음 (적절한 보호 필요) |
localStorage | ❌ 낮음 | ✅ 유지됨 | ❌ 높음 | ✅ 없음 |
sessionStorage | ❌ 낮음 | ❌ 세션 종료 시 사라짐 | ❌ 높음 | ✅ 없음 |
각 저장 방식의 자세한 설명과 고려할 사항을 살펴보자.
✅ 장점:
❌ 단점:
🔹 추천 상황:
쿠키에 httpOnly, secure, sameSite=strict 속성을 추가하면 XSS 공격에 안전하면서도 자동으로 액세스 토큰을 포함하여 요청할 수 있다.
res.cookie("accessToken", token, {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "strict"
});
✅ 장점:
❌ 단점:
SameSite=Strict
설정 또는 CSRF 토큰 추가.sameSite=strict
로 설정 시 외부 사이트에서 요청 불가).🔹 추천 상황:
✅ 보안 대책 (CSRF 보호):
X-CSRF-Token
헤더).localStorage는 XSS 공격에 취약하므로, 보안이 중요한 애플리케이션에서는 사용하지 않는 것이 좋다.
✅ 장점:
❌ 단점:
🔹 추천 상황:
sessionStorage는 XSS 공격에 취약하고, 브라우저를 닫으면 사라지므로 보안성이 높다고 보기 어렵다.
✅ 장점:
❌ 단점:
🔹 추천 상황:
저장 방식 | 추천 사용 사례 |
---|---|
메모리 저장 | 보안이 최우선인 앱 (ex: 금융, 관리자 페이지) |
HTTP-Only 쿠키 저장 | JWT 기반 인증을 사용하는 대부분의 SPA/SSR |
localStorage 저장 | 보안이 중요하지 않은 앱 (❌ 추천하지 않음) |
sessionStorage 저장 | 보안이 중요하지 않으며, 세션만 유지하는 앱 (❌ 추천하지 않음) |
✅ 최적의 선택:
httpOnly
쿠키 저장을 추천.CSRF 방어
SameSite=Strict
또는 X-CSRF-Token
사용.XSS 방어
Content Security Policy (CSP)
를 적용하여 악성 스크립트 실행 차단.dangerouslySetInnerHTML
같은 XSS 위험 요소 피하기.리프레시 토큰은 어디에 저장할까?
httpOnly
쿠키에 저장.httpOnly
쿠키에 저장.X-CSRF-Token
을 요청 헤더에 포함.이렇게 하면 XSS, CSRF 공격을 모두 방어하면서도 개발 편의성을 유지할 수 있다.