Skip to content

Commit df24d0d

Browse files
committed
docs: Documentation & Automated Test Suite
- 02. jwt-oauth2-architecture.md: RTR 시퀀스 및 세션 관리 전략 상세 설명 및 다이어그램 업데이트 - FOR UPDATE 비관적 잠금을 통한 동시성 제어 흐름 문서화 - 세션 버전 기반 토큰 재사용 탐지 시나리오 추가 - auth-test.http: 복합적 인증 시나리오 자동화 테스트 스크립트 완성 - 정상 로그인, 토큰 로테이션, 동시 접근 상황 테스트 케이스 포함 - 쿠키 기반 RefreshToken 자동 갱신 흐름 검증 스크립트 구성
1 parent 039b63b commit df24d0d

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

docs/Backend/02. jwt-oauth2-architecture.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,7 @@ sequenceDiagram
352352
> - **코드 로직**: `if (rotatedAt.plusSeconds(10).isAfter(now))`
353353
>
354354
> **3. 처리 결과 (멱등성 보장 결과 재전달)**
355-
> - **기존 후속 토큰 재전달**: 새로운 토큰을 또 만드는 대신, 최초 요청 시 이미 발급했던 **후속 토큰(Successor, RT-B)을 DB에서 조회하여 다시 응답**합니다.
356-
> - **상태 유지**: Grace Period 내라면 몇 번을 요청해도 동일한 `RT-B`를 받게 되어, 네트워크 불안정으로 인한 중복 요청 상황에서도 클라이언트가 안정적으로 최신 토큰을 확보할 수 있습니다.
355+
> - **상태 유지**: Grace Period 내라면 횟수에 상관없이 동일한 `RT-B`를 받게 되어, 네트워크 불안정으로 인한 중복 요청 상황에서도 클라이언트가 안정적으로 최신 토큰을 확보할 수 있습니다.
357356
> - **보안**: 유예 기간이 지나면 해당 토큰을 이용한 모든 요청은 거부됩니다. (이미 Successor가 발급된 상태이므로)
358357
>
359358
> **4. 만약 이 로직이 없다면?**
@@ -415,7 +414,7 @@ sequenceDiagram
415414

416415
**핵심 포인트:**
417416
- **Rotation**: 매 갱신마다 새 Refresh Token 발급 → 탈취된 토큰의 유효 시간 최소화
418-
- **Grace Period (10초)**: 네트워크 지연으로 인한 정당한 중복 요청 허용 (1회만)
417+
- **Grace Period (10초)**: 네트워크 지연으로 인한 정당한 중복 요청 허용 (유예 기간 내 횟수 제한 없음)
419418
- **FOR UPDATE**: DB 수준 비관적 락으로 동시 갱신 요청의 경합 조건 방지
420419

421420
---

src/test/api-test/auth-test.http

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,25 @@
1313
# ★ 한번만 수동 연동하면 이후에는 Send Requst 버튼만 연속해서 누르면 됩니다.
1414
# ============================================================
1515

16+
17+
18+
19+
1620
### 0. 공통 변수
1721
@baseUrl = http://localhost:8080
1822

19-
# ★ [공통 필수 단계] Step 2를 수행하여 브라우저에서 복사한 쿠키를 여기에 붙여넣으세요.
20-
@refreshTokenCookie = eyJhbGciOiJIUzM4NCJ9.eyJqdGkiOiIxMTBiOGJlYi00NDFlLTQ4ZDQtODgyYi0yN2VhYjlkNmNjM2Y6MiIsInN1YiI6IjciLCJzaWQiOiIxMTBiOGJlYi00NDFlLTQ4ZDQtODgyYi0yN2VhYjlkNmNjM2YiLCJ2ZXIiOjIsImlhdCI6MTc3NTA1NDg0NiwiZXhwIjoxNzc2MjY0NDQ2fQ.0ppPiXZSsumHjs2a1N2h157P3guZHpSGOBsIDjutGTRfssS6nNBB5kxYun-Q_sGL
21-
# ★ Step 3 실행 시 자동으로 업데이트되거나, 수동으로 응답값을 복사해 넣어주세요.
22-
@accessToken =
23+
# ★ [공통 필수 단계] Step 2를 수행하여 브라우저에서 복사한 쿠키를 여기에 붙여넣으세요 (최초1회만).
24+
@refreshTokenCookie =
25+
# ★ accessToken은 자동으로 업데이트됩니다.
26+
27+
# 메모리에 꼬인 쿠키와 토큰을 강제로 비웁니다.
28+
POST {{baseUrl}}/api/auth/logout
29+
30+
> {%
31+
client.global.set("refreshTokenCookie", "");
32+
client.global.set("accessToken", "");
33+
client.log("모든 메모리 변수가 초기화되었습니다.");
34+
%}
2335

2436
# ------------------------------------------------------------------------------
2537
# [공통 필수 단계] 로그인 및 .http 세션 연동

0 commit comments

Comments
 (0)