세션 관리 (Session Management)
1. 개요
세션 관리란 웹 애플리케이션에서 사용자가 인증된 상태를 유지하며 여러 페이지를 이동하더라도 서버가 해당 사용자를 지속적으로 식별할 수 있도록 상태 정보를 관리하는 기술적 메커니즘을 의미한다.
웹의 기본 프로토콜인 HTTP(HyperText Transfer Protocol)는 무상태성(Stateless) 특성을 가진다. 이는 서버가 클라이언트의 이전 요청을 기억하지 않고 매 요청을 독립적인 것으로 처리함을 의미한다. 이러한 특성 때문에 로그인 후 다음 페이지로 이동할 때마다 다시 인증을 거쳐야 하는 불편함이 발생하며, 이를 해결하기 위해 서버는 '세션'이라는 개념을 도입하여 사용자의 상태 정보를 유지한다.
2. 세션의 작동 원리
세션은 클라이언트와 서버 간의 상호작용을 통해 생성되고 검증된다. 여기서 세션은 서버에 저장되는 데이터의 집합이며, 쿠키는 이 데이터에 접근하기 위한 식별자인 세션 ID를 클라이언트에 저장하고 운반하는 매개체이다.
일반적인 작동 프로세스는 다음과 같다.
- 세션 생성: 사용자가 아이디/패스워드로 인증에 성공하면, 서버는 고유한 세션 ID(Session ID)를 생성한다.
- 식별자 전달: 서버는 생성된 세션 ID를 응답 헤더의
Set-Cookie를 통해 클라이언트에게 전달한다.
- 식별자 저장: 클라이언트는 전달받은 세션 ID를 브라우저의 쿠키 저장소에 보관한다.
- 요청 및 검증: 이후 클라이언트는 모든 요청 시 쿠키에 담긴 세션 ID를 함께 전송하며, 서버는 저장소에서 해당 ID와 일치하는 세션 정보가 있는지 확인하여 사용자를 식별한다.
[표] 쿠키 기반 세션 vs 토큰 기반 세션 비교
| 구분 |
쿠키 기반 세션 (Stateful) |
토큰 기반 세션 (Stateless/JWT) |
| 저장 위치 |
서버 메모리/DB 및 클라이언트 쿠키 |
클라이언트 (Local Storage/Cookie) |
| 상태 유지 |
서버가 상태를 관리 (Stateful) |
서버가 상태를 가지지 않음 (Stateless) |
| 확장성 |
서버 증설 시 세션 동기화 필요 (복잡함) |
어떤 서버에서든 검증 가능 (용이함) |
| 보안성 |
세션 ID 탈취 시 위험, 서버 제어 가능 |
토큰 탈취 시 만료 전까지 제어 어려움 |
| 데이터 크기 |
세션 ID만 전달하므로 네트워크 부하 적음 |
토큰 내 정보 포함으로 데이터 크기가 큼 |
3. 세션 관리 방식 및 구현
3.1 서버 사이드 세션 (Server-side Session)
서버의 저장소에 사용자 정보를 저장하고 클라이언트에게는 키(Key) 값인 세션 ID만 제공하는 방식이다.
- 메모리 저장: 서버 RAM에 저장. 속도가 매우 빠르나 서버 재시작 시 데이터가 소멸하며, 단일 서버에서만 유효하다.
- 데이터베이스(DB) 저장: RDBMS에 저장. 영속성이 보장되나 I/O 비용으로 인해 성능이 저하된다.
- 인메모리 DB (Redis 등): Key-Value 구조의 고속 저장소 사용. 성능과 확장성을 동시에 잡을 수 있어 가장 널리 쓰인다.
3.2 클라이언트 사이드 세션 (Client-side Session)
사용자 정보를 암호화하거나 서명하여 토큰(예: JWT - JSON Web Token) 형태로 클라이언트에 저장하는 방식이다. 서버는 별도의 저장소 없이 토큰의 서명(Signature)만 검증하여 신원을 확인한다.
3.3 구현 예시 (Pseudo Code)
// cookie-parser와 같은 미들웨어를 통해 req.cookies 사용 가능 전제
const sessionStore = require('./redisClient'); // Redis 클라이언트 인스턴스
// 1. 세션 생성 및 저장 (서버 사이드)
function login(user) {
// UUID(Universally Unique Identifier) 등을 사용하여 예측 불가능한 고유 ID 생성
const sessionId = generateUUID();
// Redis 등 외부 저장소에 사용자 정보 저장
sessionStore.set(sessionId, { userId: user.id, role: user.role });
return sessionId; // 클라이언트에 Set-Cookie 헤더로 전달
}
// 2. 세션 검증 (미들웨어)
function authMiddleware(req, res, next) {
const sessionId = req.cookies.sessionId; // 쿠키에서 세션 ID 추출
const sessionData = sessionStore.get(sessionId); // 저장소에서 데이터 조회
if (!sessionData) {
return res.status(401).send("인증되지 않은 사용자입니다.");
}
req.user = sessionData;
next();
}
3.4 세션 저장소별 성능 비교 지표
| 저장소 유형 |
읽기/쓰기 속도 |
확장성 (Scalability) |
데이터 영속성 |
비고 |
| Local Memory |
매우 높음 |
매우 낮음 |
없음 |
단일 서버 전용 |
| RDBMS (MySQL 등) |
낮음 |
보통 |
높음 |
트랜잭션 보장 필요 시 사용 |
| Redis / Memcached |
높음 |
높음 |
보통 (설정 가능) |
분산 환경 표준 |
4. 세션 보안 위협
세션 ID는 사용자의 신원을 증명하는 '열쇠'와 같으므로 다양한 공격의 대상이 된다.
- 세션 하이재킹 (Session Hijacking): 공격자가 네트워크 스니핑이나 XSS를 통해 유효한 세션 ID를 탈취하여 사용자로 위장하는 공격이다.
- 세션 고정 (Session Fixation): 공격자가 미리 생성한 세션 ID를 사용자에게 강제로 부여(예: URL 파라미터)하고, 사용자가 로그인하면 해당 ID를 그대로 사용하여 권한을 획득하는 공격이다.
- XSS (Cross-Site Scripting): 악성 스크립트를 삽입하여 브라우저의
document.cookie를 통해 세션 ID를 외부 서버로 전송하게 만드는 공격이다.
- CSRF (Cross-Site Request Forgery): 사용자가 인증된 상태에서 공격자가 유도한 악성 링크를 클릭하게 하여, 사용자의 의도와 무관하게 서버에 위조된 요청(비밀번호 변경, 결제 등)을 보내게 하는 공격이다. 브라우저가 요청 시 쿠키를 자동으로 포함하는 특성을 이용한다.
5. 안전한 세션 관리 전략
5.1 보안 설정 및 플래그
- HttpOnly 플래그: JavaScript를 통한 쿠키 접근을 차단하여 XSS 공격으로 인한 세션 ID 탈취를 원천적으로 방지한다.
- Secure 플래그: HTTPS 프로토콜을 통해서만 쿠키가 전송되도록 제한하여 네트워크 스니핑(Man-in-the-Middle)을 방지한다.
- SameSite 속성: CSRF 공격을 방지하기 위해 타 사이트에서의 쿠키 전송 여부를 제어한다.
Strict: 동일 사이트 요청에서만 쿠키 전송.
Lax: 기본 설정. 안전한 상위 수준의 탐색(링크 클릭 등)에서만 전송 허용.
5.2 세션 생명주기 및 갱신 전략
- 세션 타임아웃 (Session Timeout): 일정 시간 동안 활동이 없는 세션을 자동으로 만료시켜 탈취된 세션의 유효 기간을 최소화한다.
- 슬라이딩 윈도우 (Sliding Expiration): 사용자가 요청을 보낼 때마다 세션 만료 시간을 연장하는 방식이다. 활동 중인 사용자의 편의성을 높이면서도, 장기간 미사용 세션은 효율적으로 제거할 수 있다.
- 세션 ID 재생성 (Regeneration): 로그인 성공 직후 또는 권한 변경 시 기존 세션 ID를 폐기하고 새로운 ID를 발급하여 세션 고정 공격을 방지한다.
5.3 세션 하이재킹 방지 구체화 방안
- 사용자 환경 정보 검증: 세션 생성 시 사용자의 IP 주소, User-Agent(브라우저 정보) 등을 함께 저장하고, 요청마다 이를 비교하여 급격한 변경이 있을 경우 세션을 강제 종료한다.
- 짧은 유효 기간 설정: 세션의 절대적 만료 시간을 짧게 설정하고, Refresh Token 메커니즘을 도입하여 보안성과 편의성을 동시에 확보한다.
- TLS/SSL 강제: 모든 통신 구간을 암호화하여 네트워크 상에서 세션 ID가 평문으로 노출되는 것을 방지한다.
5.4 세션 만료 및 로그아웃 처리 절차
안전한 로그아웃은 단순히 클라이언트의 쿠키를 삭제하는 것이 아니라 서버 측의 상태를 완전히 제거해야 한다.
1. 클라이언트 요청: 사용자가 로그아웃 버튼 클릭.
2. 서버 측 세션 파기: 서버 저장소(Redis, DB 등)에서 해당 세션 ID와 연결된 데이터를 즉시 삭제한다.
3. 쿠키 무효화: 응답 헤더에 Set-Cookie를 통해 만료 시간(Max-Age=0 또는 Expires 과거 날짜)을 설정하여 브라우저의 쿠키를 삭제한다.
4. 리다이렉트: 인증이 필요 없는 메인 페이지나 로그인 페이지로 사용자를 이동시킨다.
6. 세션 관리의 최신 트렌드
6.1 MSA(마이크로서비스 아키텍처)와 분산 세션
서비스가 여러 개의 독립적인 서버로 분리된 MSA 환경에서는 개별 서버의 메모리에 세션을 저장할 수 없다. 이를 위해 다음과 같은 방식을 사용한다.
* Sticky Session: L4/L7 스위치에서 특정 사용자의 요청을 항상 동일한 서버로 보내는 방식이나, 특정 서버 부하 집중 및 서버 장애 시 세션 소실 문제가 있다.
* Session Clustering: 서버 간 세션 데이터를 복제하는 방식이나, 서버 대수가 늘어날수록 복제 트래픽이 기하급수적으로 증가한다.
* External Session Store: Redis와 같은 외부 저장소를 공유하여 모든 서버가 동일한 세션 데이터에 접근하는 방식으로, 현재 가장 권장되는 모델이다.
최근에는 서비스 자체 세션 관리보다는 OAuth 2.0 및 OIDC(OpenID Connect) 표준을 활용한 위임 인증 체계가 주를 이룬다. Google, Kakao 등의 IDP(Identity Provider)가 인증을 처리하고, 서비스 서버는 전달받은 <a href="/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88/%EA%B6%8C%ED%95%9C%20%EA%B4%80%EB%A6%AC/Access%20Token" class="wiki-link wiki-link-missing">Access Token</a>과 ID Token을 통해 사용자를 식별함으로써 세션 관리의 부담을 줄이고 보안성을 높인다.
7. 실제 서비스 세션 설계 사례
[사례: 대규모 이커머스 플랫폼 A사]
| 구분 |
문제 상황 (Pain Point) |
해결책 (Solution) |
결과 (Outcome) |
| 인증 성능 |
매 요청마다 DB를 조회하여 사용자 권한을 확인하므로 응답 속도 저하 및 DB 부하 발생 |
짧은 만료 시간(30분)을 가진 JWT(Access Token) 도입 및 API Gateway에서 서명 검증 |
DB 조회 횟수 획기적 감소 및 응답 속도 개선 |
| 사용자 경험 |
보안을 위해 짧은 만료 시간을 설정하자 사용자가 너무 자주 로그인해야 하는 불편함 발생 |
긴 만료 시간(14일)을 가진 Refresh Token을 Redis에 저장하여 자동 갱신 구현 |
'로그인 유지' 기능 제공으로 사용자 이탈 방지 및 편의성 증대 |
| 보안 위협 |
토큰 탈취 시 서버에서 강제로 세션을 만료시킬 방법이 없어 보안 취약점 발생 |
Refresh Token 저장소(Redis)에서 특정 사용자의 토큰을 삭제하는 Blacklist/Revocation 메커니즘 적용 |
기기 변경, 비밀번호 변경 시 즉각적인 강제 로그아웃 처리 가능 |
| 토큰 탈취 |
클라이언트 사이드 저장소(LocalStorage)에 저장된 토큰이 XSS 공격에 노출될 위험 |
Refresh Token을 HttpOnly, Secure 쿠키에 저장하여 스크립트 접근 차단 |
XSS를 통한 세션 탈취 가능성을 최소화하여 보안성 강화 |
8. 관련 문서 및 참고 문헌
# 세션 관리 (Session Management)
## 1. 개요
세션 관리란 웹 애플리케이션에서 사용자가 인증된 상태를 유지하며 여러 페이지를 이동하더라도 서버가 해당 사용자를 지속적으로 식별할 수 있도록 상태 정보를 관리하는 기술적 메커니즘을 의미한다.
웹의 기본 프로토콜인 HTTP(HyperText Transfer Protocol)는 **무상태성(Stateless)** 특성을 가진다. 이는 서버가 클라이언트의 이전 요청을 기억하지 않고 매 요청을 독립적인 것으로 처리함을 의미한다. 이러한 특성 때문에 로그인 후 다음 페이지로 이동할 때마다 다시 인증을 거쳐야 하는 불편함이 발생하며, 이를 해결하기 위해 서버는 '세션'이라는 개념을 도입하여 사용자의 상태 정보를 유지한다.
## 2. 세션의 작동 원리
세션은 클라이언트와 서버 간의 상호작용을 통해 생성되고 검증된다. 여기서 **세션은 서버에 저장되는 데이터의 집합이며, 쿠키는 이 데이터에 접근하기 위한 식별자인 세션 ID를 클라이언트에 저장하고 운반하는 매개체**이다.
일반적인 작동 프로세스는 다음과 같다.
1. **세션 생성**: 사용자가 아이디/패스워드로 인증에 성공하면, 서버는 고유한 **세션 ID(Session ID)**를 생성한다.
2. **식별자 전달**: 서버는 생성된 세션 ID를 응답 헤더의 `Set-Cookie`를 통해 클라이언트에게 전달한다.
3. **식별자 저장**: 클라이언트는 전달받은 세션 ID를 브라우저의 쿠키 저장소에 보관한다.
4. **요청 및 검증**: 이후 클라이언트는 모든 요청 시 쿠키에 담긴 세션 ID를 함께 전송하며, 서버는 저장소에서 해당 ID와 일치하는 세션 정보가 있는지 확인하여 사용자를 식별한다.
### [표] 쿠키 기반 세션 vs 토큰 기반 세션 비교
| 구분 | 쿠키 기반 세션 (Stateful) | 토큰 기반 세션 (Stateless/JWT) |
| :--- | :--- | :--- |
| **저장 위치** | 서버 메모리/DB 및 클라이언트 쿠키 | 클라이언트 (Local Storage/Cookie) |
| **상태 유지** | 서버가 상태를 관리 (Stateful) | 서버가 상태를 가지지 않음 (Stateless) |
| **확장성** | 서버 증설 시 세션 동기화 필요 (복잡함) | 어떤 서버에서든 검증 가능 (용이함) |
| **보안성** | 세션 ID 탈취 시 위험, 서버 제어 가능 | 토큰 탈취 시 만료 전까지 제어 어려움 |
| **데이터 크기** | 세션 ID만 전달하므로 네트워크 부하 적음 | 토큰 내 정보 포함으로 데이터 크기가 큼 |
## 3. 세션 관리 방식 및 구현
### 3.1 서버 사이드 세션 (Server-side Session)
서버의 저장소에 사용자 정보를 저장하고 클라이언트에게는 키(Key) 값인 세션 ID만 제공하는 방식이다.
* **메모리 저장**: 서버 RAM에 저장. 속도가 매우 빠르나 서버 재시작 시 데이터가 소멸하며, 단일 서버에서만 유효하다.
* **데이터베이스(DB) 저장**: RDBMS에 저장. 영속성이 보장되나 I/O 비용으로 인해 성능이 저하된다.
* **인메모리 DB (Redis 등)**: Key-Value 구조의 고속 저장소 사용. 성능과 확장성을 동시에 잡을 수 있어 가장 널리 쓰인다.
### 3.2 클라이언트 사이드 세션 (Client-side Session)
사용자 정보를 암호화하거나 서명하여 토큰(예: JWT - JSON Web Token) 형태로 클라이언트에 저장하는 방식이다. 서버는 별도의 저장소 없이 토큰의 서명(Signature)만 검증하여 신원을 확인한다.
### 3.3 구현 예시 (Pseudo Code)
```javascript
// cookie-parser와 같은 미들웨어를 통해 req.cookies 사용 가능 전제
const sessionStore = require('./redisClient'); // Redis 클라이언트 인스턴스
// 1. 세션 생성 및 저장 (서버 사이드)
function login(user) {
// UUID(Universally Unique Identifier) 등을 사용하여 예측 불가능한 고유 ID 생성
const sessionId = generateUUID();
// Redis 등 외부 저장소에 사용자 정보 저장
sessionStore.set(sessionId, { userId: user.id, role: user.role });
return sessionId; // 클라이언트에 Set-Cookie 헤더로 전달
}
// 2. 세션 검증 (미들웨어)
function authMiddleware(req, res, next) {
const sessionId = req.cookies.sessionId; // 쿠키에서 세션 ID 추출
const sessionData = sessionStore.get(sessionId); // 저장소에서 데이터 조회
if (!sessionData) {
return res.status(401).send("인증되지 않은 사용자입니다.");
}
req.user = sessionData;
next();
}
```
### 3.4 세션 저장소별 성능 비교 지표
| 저장소 유형 | 읽기/쓰기 속도 | 확장성 (Scalability) | 데이터 영속성 | 비고 |
| :--- | :--- | :--- | :--- | :--- |
| **Local Memory** | 매우 높음 | 매우 낮음 | 없음 | 단일 서버 전용 |
| **RDBMS (MySQL 등)** | 낮음 | 보통 | 높음 | 트랜잭션 보장 필요 시 사용 |
| **Redis / Memcached** | 높음 | 높음 | 보통 (설정 가능) | 분산 환경 표준 |
## 4. 세션 보안 위협
세션 ID는 사용자의 신원을 증명하는 '열쇠'와 같으므로 다양한 공격의 대상이 된다.
* **세션 하이재킹 (Session Hijacking)**: 공격자가 네트워크 스니핑이나 XSS를 통해 유효한 세션 ID를 탈취하여 사용자로 위장하는 공격이다.
* **세션 고정 (Session Fixation)**: 공격자가 미리 생성한 세션 ID를 사용자에게 강제로 부여(예: URL 파라미터)하고, 사용자가 로그인하면 해당 ID를 그대로 사용하여 권한을 획득하는 공격이다.
* **XSS (Cross-Site Scripting)**: 악성 스크립트를 삽입하여 브라우저의 `document.cookie`를 통해 세션 ID를 외부 서버로 전송하게 만드는 공격이다.
* **CSRF (Cross-Site Request Forgery)**: 사용자가 인증된 상태에서 공격자가 유도한 악성 링크를 클릭하게 하여, 사용자의 의도와 무관하게 서버에 위조된 요청(비밀번호 변경, 결제 등)을 보내게 하는 공격이다. 브라우저가 요청 시 쿠키를 자동으로 포함하는 특성을 이용한다.
## 5. 안전한 세션 관리 전략
### 5.1 보안 설정 및 플래그
* **HttpOnly 플래그**: JavaScript를 통한 쿠키 접근을 차단하여 XSS 공격으로 인한 세션 ID 탈취를 원천적으로 방지한다.
* **Secure 플래그**: HTTPS 프로토콜을 통해서만 쿠키가 전송되도록 제한하여 네트워크 스니핑(Man-in-the-Middle)을 방지한다.
* **SameSite 속성**: CSRF 공격을 방지하기 위해 타 사이트에서의 쿠키 전송 여부를 제어한다.
* `Strict`: 동일 사이트 요청에서만 쿠키 전송.
* `Lax`: 기본 설정. 안전한 상위 수준의 탐색(링크 클릭 등)에서만 전송 허용.
### 5.2 세션 생명주기 및 갱신 전략
* **세션 타임아웃 (Session Timeout)**: 일정 시간 동안 활동이 없는 세션을 자동으로 만료시켜 탈취된 세션의 유효 기간을 최소화한다.
* **슬라이딩 윈도우 (Sliding Expiration)**: 사용자가 요청을 보낼 때마다 세션 만료 시간을 연장하는 방식이다. 활동 중인 사용자의 편의성을 높이면서도, 장기간 미사용 세션은 효율적으로 제거할 수 있다.
* **세션 ID 재생성 (Regeneration)**: 로그인 성공 직후 또는 권한 변경 시 기존 세션 ID를 폐기하고 새로운 ID를 발급하여 세션 고정 공격을 방지한다.
### 5.3 세션 하이재킹 방지 구체화 방안
* **사용자 환경 정보 검증**: 세션 생성 시 사용자의 IP 주소, User-Agent(브라우저 정보) 등을 함께 저장하고, 요청마다 이를 비교하여 급격한 변경이 있을 경우 세션을 강제 종료한다.
* **짧은 유효 기간 설정**: 세션의 절대적 만료 시간을 짧게 설정하고, Refresh Token 메커니즘을 도입하여 보안성과 편의성을 동시에 확보한다.
* **TLS/SSL 강제**: 모든 통신 구간을 암호화하여 네트워크 상에서 세션 ID가 평문으로 노출되는 것을 방지한다.
### 5.4 세션 만료 및 로그아웃 처리 절차
안전한 로그아웃은 단순히 클라이언트의 쿠키를 삭제하는 것이 아니라 서버 측의 상태를 완전히 제거해야 한다.
1. **클라이언트 요청**: 사용자가 로그아웃 버튼 클릭.
2. **서버 측 세션 파기**: 서버 저장소(Redis, DB 등)에서 해당 세션 ID와 연결된 데이터를 즉시 삭제한다.
3. **쿠키 무효화**: 응답 헤더에 `Set-Cookie`를 통해 만료 시간(`Max-Age=0` 또는 `Expires` 과거 날짜)을 설정하여 브라우저의 쿠키를 삭제한다.
4. **리다이렉트**: 인증이 필요 없는 메인 페이지나 로그인 페이지로 사용자를 이동시킨다.
## 6. 세션 관리의 최신 트렌드
### 6.1 MSA(마이크로서비스 아키텍처)와 분산 세션
서비스가 여러 개의 독립적인 서버로 분리된 MSA 환경에서는 개별 서버의 메모리에 세션을 저장할 수 없다. 이를 위해 다음과 같은 방식을 사용한다.
* **Sticky Session**: L4/L7 스위치에서 특정 사용자의 요청을 항상 동일한 서버로 보내는 방식이나, 특정 서버 부하 집중 및 서버 장애 시 세션 소실 문제가 있다.
* **Session Clustering**: 서버 간 세션 데이터를 복제하는 방식이나, 서버 대수가 늘어날수록 복제 트래픽이 기하급수적으로 증가한다.
* **External Session Store**: Redis와 같은 외부 저장소를 공유하여 모든 서버가 동일한 세션 데이터에 접근하는 방식으로, 현재 가장 권장되는 모델이다.
### 6.2 OAuth 2.0 및 OIDC 기반 인증
최근에는 서비스 자체 세션 관리보다는 **OAuth 2.0** 및 **OIDC(OpenID Connect)** 표준을 활용한 위임 인증 체계가 주를 이룬다. Google, Kakao 등의 IDP(Identity Provider)가 인증을 처리하고, 서비스 서버는 전달받은 `Access Token`과 `ID Token`을 통해 사용자를 식별함으로써 세션 관리의 부담을 줄이고 보안성을 높인다.
## 7. 실제 서비스 세션 설계 사례
**[사례: 대규모 이커머스 플랫폼 A사]**
| 구분 | 문제 상황 (Pain Point) | 해결책 (Solution) | 결과 (Outcome) |
| :--- | :--- | :--- | :--- |
| **인증 성능** | 매 요청마다 DB를 조회하여 사용자 권한을 확인하므로 응답 속도 저하 및 DB 부하 발생 | 짧은 만료 시간(30분)을 가진 **JWT(Access Token)** 도입 및 API Gateway에서 서명 검증 | DB 조회 횟수 획기적 감소 및 응답 속도 개선 |
| **사용자 경험** | 보안을 위해 짧은 만료 시간을 설정하자 사용자가 너무 자주 로그인해야 하는 불편함 발생 | 긴 만료 시간(14일)을 가진 **Refresh Token**을 Redis에 저장하여 자동 갱신 구현 | '로그인 유지' 기능 제공으로 사용자 이탈 방지 및 편의성 증대 |
| **보안 위협** | 토큰 탈취 시 서버에서 강제로 세션을 만료시킬 방법이 없어 보안 취약점 발생 | Refresh Token 저장소(Redis)에서 특정 사용자의 토큰을 삭제하는 **Blacklist/Revocation** 메커니즘 적용 | 기기 변경, 비밀번호 변경 시 즉각적인 강제 로그아웃 처리 가능 |
| **토큰 탈취** | 클라이언트 사이드 저장소(LocalStorage)에 저장된 토큰이 XSS 공격에 노출될 위험 | Refresh Token을 **`HttpOnly`, `Secure` 쿠키**에 저장하여 스크립트 접근 차단 | XSS를 통한 세션 탈취 가능성을 최소화하여 보안성 강화 |
## 8. 관련 문서 및 참고 문헌
* [OWASP Session Management Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html)
* [RFC 6265: HTTP State Management Mechanism](https://datatracker.ietf.org/doc/html/rfc6265)
* [MDN Web Docs: HTTP Cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies)