@@ -31,24 +31,28 @@ sequenceDiagram
3131### 1. 백엔드 (FastAPI - ` apps/api/ ` )
3232
3333** 필수 파일:**
34+
3435- ` src/lib/auth.py ` - JWE 토큰 생성/검증, OAuth 검증
3536- ` src/auth/router.py ` - 인증 endpoint
3637- ` src/users/model.py ` - User DB 모델
3738- ` src/lib/dependencies.py ` - 인증용 dependency injection
3839
3940** 핵심 함수:**
41+
4042- ` create_access_token(user_id) ` - 만료 1시간의 JWE access token 생성
4143- ` create_refresh_token(user_id) ` - 만료 7일의 JWE refresh token 생성
4244- ` decode_token(token) ` - JWE 토큰 검증 및 payload 추출
4345- ` verify_oauth_token(provider, token) ` - OAuth 토큰 재검증 (Google/GitHub/Facebook)
4446- ` get_current_user(request) ` - Authorization header에서 사용자 추출
4547
4648** Endpoints:**
49+
4750- ` POST /api/auth/login ` - OAuth 로그인
4851- ` POST /api/auth/refresh ` - 토큰 갱신
4952- ` POST /api/auth/logout ` - 로그아웃
5053
5154** 보안:**
55+
5256- JWE 암호화 (A256GCM)
5357- Access Token: 만료 1시간
5458- Refresh Token: 만료 7일
@@ -57,11 +61,14 @@ sequenceDiagram
5761### 2. 프론트엔드 (Next.js - ` apps/web/ ` )
5862
5963** 필수 파일:**
64+
6065- ` src/lib/auth.ts ` - Better Auth 서버 설정 (OAuth providers)
61- - ` src/lib/auth-client.ts ` - API client (Orval 자동 생성, 토큰 관리)
66+ - ` src/lib/auth-client.ts ` - Better Auth 클라이언트 및 토큰 교환 로직
67+ - ` src/lib/api-client.ts ` - HTTP 클라이언트 및 토큰 관리 (interceptors)
6268- ` src/app/api/auth/[...all]/route.ts ` - Better Auth route handler
6369
6470** 핵심 동작/함수:**
71+
6572- Better Auth OAuth 로그인 (signIn.social)
6673- OAuth → 백엔드 JWT 교환 (자동)
6774- Authorization header 자동 주입
@@ -70,20 +77,23 @@ sequenceDiagram
7077- 로그아웃 시 토큰 정리
7178
7279** 보안:**
80+
7381- localStorage 저장 (prefix: ` fullstack_ ` )
7482- JWE 토큰 (백엔드 발급)
7583- Authorization header 자동 설정
7684
7785## 토큰 관리
7886
7987### Access Token
88+
8089- ** 형식:** JWE (JSON Web Encryption)
8190- ** 알고리즘:** A256GCM (AES-256-GCM)
8291- ** 만료:** 1시간
8392- ** 저장 위치:** ` localStorage.fullstack_access_token `
8493- ** 사용:** API 요청 시 ` Authorization: Bearer {token} ` header
8594
8695### Refresh Token
96+
8797- ** 형식:** JWE
8898- ** 알고리즘:** A256GCM
8999- ** 만료:** 7일
@@ -171,17 +181,20 @@ Backend: Logout processing (client token invalidation if needed)
171181## 보안 기능
172182
173183### 1. JWE 암호화
184+
174185- ** 완전 암호화:** payload 전체를 암호화
175186- ** 알고리즘:** A256GCM (AES-256-GCM)
176187- ** 장점:** (일반적인 JWT(JWS)와 달리) payload가 노출되지 않음
177188- ** Authentication Tag (authTag):** 무결성(Integrity) 보장 및 위변조 탐지
178189
179190### 2. Stateless 특성
191+
180192- ** 서버 세션 없음:** 세션 상태를 서버에 저장할 필요 없음
181193- ** 확장 용이:** 로드 밸런싱이 쉬움
182194- ** 스케일 아웃:** 서버 증설이 쉬움
183195
184196### 3. 토큰 만료 전략
197+
185198- ** Access Token:** 짧은 만료(1시간) - 보안 최적화
186199- ** Refresh Token:** 긴 만료(7일) - 사용자 편의성
187200- ** Auto Refresh:** 만료 시 자동 갱신
@@ -215,14 +228,6 @@ DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/app
215228
216229# Better Auth (OAuth only)
217230BETTER_AUTH_URL=http://localhost:3000
218-
219- # OAuth Providers (optional)
220- GOOGLE_CLIENT_ID=
221- GOOGLE_CLIENT_SECRET=
222- GITHUB_CLIENT_ID=
223- GITHUB_CLIENT_SECRET=
224- FACEBOOK_CLIENT_ID=
225- FACEBOOK_CLIENT_SECRET=
226231```
227232
228233### 프론트엔드 (apps/web/.env)
@@ -247,9 +252,11 @@ FACEBOOK_CLIENT_SECRET=
247252## API Endpoints
248253
249254### POST /api/auth/login
255+
250256** 목적:** OAuth token을 백엔드 JWT로 교환
251257
252258** Request Body:**
259+
253260``` json
254261{
255262 "provider" : " google" | "github" | "facebook",
@@ -260,6 +267,7 @@ FACEBOOK_CLIENT_SECRET=
260267```
261268
262269** Response:**
270+
263271``` json
264272{
265273 "access_token" : " <JWE encrypted access token>" ,
@@ -269,16 +277,19 @@ FACEBOOK_CLIENT_SECRET=
269277```
270278
271279### POST /api/auth/refresh
280+
272281** 목적:** refresh token으로 새로운 access token 발급
273282
274283** Request Body:**
284+
275285``` json
276286{
277287 "refresh_token" : " <JWE encrypted refresh token>"
278288}
279289```
280290
281291** Response:**
292+
282293``` json
283294{
284295 "access_token" : " <JWE encrypted new access token>" ,
@@ -288,27 +299,36 @@ FACEBOOK_CLIENT_SECRET=
288299```
289300
290301### POST /api/auth/logout
302+
291303** 목적:** 클라이언트 측 토큰 정리
292304
293305** Response:** 204 No Content
294306
295- ## Orval 자동 생성 API Client
307+ ## 클라이언트 토큰 관리
296308
297309### auth.ts
310+
298311Better Auth 서버 설정을 담당하는 파일입니다.
299312
300313### auth-client.ts
301- FastAPI schema로부터 Orval이 자동 생성한 API client입니다.
314+
315+ Better Auth 클라이언트 초기화 및 OAuth 토큰을 백엔드 JWE 토큰으로 교환하는 로직을 담당합니다.
316+
317+ ### api-client.ts
318+
319+ 토큰 자동 주입 및 갱신을 위한 interceptor가 설정된 수동 Axios 인스턴스입니다.
302320
303321** 핵심 함수:**
322+
304323- ` exchangeOAuthForBackendJwt() ` - OAuth → 백엔드 JWT 자동 교환
305324- ` setAccessToken() ` - access token 저장
306325- ` setRefreshToken() ` - refresh token 저장
307326- ` clearTokens() ` - 전체 토큰 정리
308327- ` hasBackendAccessToken() ` - 백엔드 토큰 존재 여부 확인
309328
310329** 자동 기능:**
311- - Authorization header 자동 주입
330+
331+ - Authorization header 자동 주입 (` apiClient ` interceptor)
312332- 401 에러 발생 시 자동 토큰 갱신
313333- 재시도 큐 관리
314334- In-memory 토큰 저장 (Map + localStorage)
@@ -326,18 +346,22 @@ FastAPI schema로부터 Orval이 자동 생성한 API client입니다.
326346## 주요 장점
327347
328348### 1. 성능 개선
349+
329350- Better Auth 서버 호출 감소 (~ 50-100ms 절감)
330351- 백엔드 부하 감소
331352
332353### 2. 확장성
354+
333355- 서버 상태가 없어서 손쉬운 스케일링
334356- 로드 밸런싱 용이
335357
336358### 3. 모바일 친화적
359+
337360- Authorization header 방식은 모바일에 최적
338361- cookie 기반 인증보다 단순
339362
340363### 4. 보안 강화
364+
341365- JWE 암호화로 데이터 노출 방지
342366- 짧은 access token 만료 시간
343367
0 commit comments