1
0
forked from baron/baron-sso

gateway 분리 아키텍처

This commit is contained in:
Lectom C Han
2026-01-30 17:56:42 +09:00
parent 03a78d75ae
commit 9e9c622600
15 changed files with 691 additions and 55 deletions

View File

@@ -37,3 +37,41 @@
2. `/oauth2/auth/requests/login/accept``login_verifier`
3. `/oauth2/auth?client_id=...&login_verifier=...` 호출 → Location 헤더에서 `consent_challenge` 추출
4. `/oauth2/auth/requests/consent/accept` 호출
## 추가 시도 및 결과
### 5) login_verifier를 이용한 consent_challenge 생성 (public /oauth2/auth 호출)
- 시도: `login_verifier``/oauth2/auth?login_verifier=...` 호출 → Location에서 `consent_challenge` 추출 시도
- 실패: `login_verifier has already been used` 또는 `invalid_client` 등으로 예제 redirect(`https://example.com/callback?...`) 에러 반환
- 원인 추정:
- `login_verifier`는 1회성으로, 기존 흐름(redirect_to 또는 consent app)에 의해 이미 사용됨
- `login_verifier`만으로는 client 맥락이 부족하여 invalid_client 발생 가능
### 6) 임시 consent app(127.0.0.1:3000) 없이 redirect_to 직접 호출
- 실패: consent app 미기동으로 연결 불가
- 원인: login/consent UI URL이 기본값(127.0.0.1:3000)이라 실제 서비스 필요
### 7) Python 컨테이너에서 임시 consent app + 클라이언트 플로우 실행
- 방법: python:3.12-alpine 컨테이너에서
- 127.0.0.1:3000에 최소 consent 앱 실행
- `/oauth2/auth` 호출을 따라가며 login/consent 자동 수락
- 결과:
- 첫 시도에서 `state` 길이 부족으로 `invalid_state` 발생
- 이후 `state/nonce` 길이 충분히 늘려 재시도 중
## 현재 결론
- 실제 consent 앱이 없으면 Hydra는 consent_challenge를 만들 수 없고 흐름이 중단됨.
- 임시 consent 앱을 컨테이너 내부에서 띄우는 방식이 가장 현실적이며, 이 흐름으로 계속 진행 중.
### 8) devfront/hydra-rp-dummy.py + docker mount 실행
- 방식: `hydra-rp-dummy.py`를 컨테이너에 마운트하여 임시 consent app(127.0.0.1:3000)으로 로그인/동의 자동 수락
- 결과: 최종 리다이렉트가 `request_forbidden` (CSRF 쿠키 없음) 에러로 종료됨
- 하지만 Hydra Admin 조회 결과 consent 세션은 생성됨
- `handled_at`: 2026-01-30T05:01:46.770699Z
- subject: `22607c1b-bfbf-4a90-9505-36b348472e7a`
- client_id: `52a597f0-5b06-4fcb-b804-93e88a56a75a`
- grant_scope: `openid profile email`
### 상태
- consent 세션 생성 완료(확인됨)
- 최종 리다이렉트 단계에서 CSRF 오류는 남아 있으나, 목적(연동/동의 저장)은 달성됨

51
docs/hydra-rp-dummy.md Normal file
View File

@@ -0,0 +1,51 @@
# hydra-rp-dummy 사용 기록
## 목적
`devfront/hydra-rp-dummy.py`를 이용해 Hydra에 더미 RP consent를 생성하고, UserFront 활동상황 카드에 반영되는지 확인합니다.
## 사전 조건
- Hydra/크라토스 스택이 실행 중이어야 합니다.
- `ory_hydra` 컨테이너가 존재해야 합니다.
- Docker 이미지 `python:3.12-alpine`가 필요합니다.
## 입력 값
- `CLIENT_ID`: 더미 RP의 client_id
- `SUBJECT`: Kratos identity id (예: `22607c1b-bfbf-4a90-9505-36b348472e7a`)
- `REDIRECT_URI`: client에 등록된 redirect_uri
- `SCOPE`: `openid profile email`
- `STATE`, `NONCE`: 충분히 긴 랜덤 값
## 실행 방법
다음 명령으로 `hydra-rp-dummy.py`를 컨테이너에 마운트해 실행합니다.
```bash
docker run --rm --network container:ory_hydra \
-v /home/lectom/repos/baron-sso/devfront/hydra-rp-dummy.py:/tmp/hydra-rp-dummy.py:ro \
-e CLIENT_ID=52a597f0-5b06-4fcb-b804-93e88a56a75a \
-e SUBJECT=22607c1b-bfbf-4a90-9505-36b348472e7a \
-e REDIRECT_URI=https://example.com/callback \
-e SCOPE='openid profile email' \
-e STATE=state-$(date +%s%N) \
-e NONCE=nonce-$(date +%s%N) \
python:3.12-alpine python /tmp/hydra-rp-dummy.py
```
## 동작 방식 요약
- `hydra-rp-dummy.py`가 127.0.0.1:3000에 임시 consent app을 띄웁니다.
- `/oauth2/auth` 호출로 login_challenge를 받고 자동 수락합니다.
- 이어서 consent_challenge를 받아 자동 수락합니다.
- 마지막 redirect 단계에서 CSRF 에러가 발생할 수 있으나, **consent 세션 자체는 생성됩니다.**
## 생성 확인 방법
Hydra Admin API에서 consent 세션을 확인합니다.
```bash
docker run --rm --network container:ory_hydra curlimages/curl:8.11.1 \
sh -lc 'curl -s "http://127.0.0.1:4445/oauth2/auth/sessions/consent?subject=22607c1b-bfbf-4a90-9505-36b348472e7a&client=52a597f0-5b06-4fcb-b804-93e88a56a75a"'
```
예시 응답에 `grant_scope`, `handled_at`, `client_id` 등이 포함되면 성공입니다.
## 참고
- `URLS_LOGIN`, `URLS_CONSENT`는 현재 `http://127.0.0.1:3000`으로 설정되어 있습니다.
- 따라서 임시 consent app 없이는 consent 생성이 진행되지 않습니다.