DOCS/journey/troubleshooting/250817_happybell80_OAuth권한최소화및프로필버그수정.md
Claude-51124 22557e7132 docs: 오래된 트러블슈팅 아카이브 및 구조 정리
- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동
- book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서)
- 빈 폴더 제거 (journey/assets/*)
2025-11-17 14:06:05 +09:00

136 lines
4.2 KiB
Markdown

# 250817_happybell80_OAuth권한최소화및프로필버그수정
## 오전 1시 23분
### Google OAuth 과도한 권한 문제 해결
#### 문제 상황
- 사용자가 Google OAuth 로그인 시 Gmail 전체 권한 요청 화면이 나타남
- `gmail.modify` 스코프가 요청되어 사용자가 거부 (access_denied)
- 단순 로그인에 이메일 읽기/쓰기/삭제 권한은 과도함
#### 원인 분석
1. auth-server의 `app/providers/gmail.py`에서 과도한 스코프 요청
```python
SCOPES = [
"openid",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/gmail.modify", # 문제!
]
```
2. `gmail.modify`는 사용자의 모든 이메일에 대한 읽기/쓰기/삭제 권한
3. 로그인 목적에는 완전히 불필요한 권한
#### 해결 과정
##### 1차 시도 - 코드 수정
- auth-server의 스코프를 최소 권한으로 변경
```python
SCOPES = [
"openid",
"email", # 이메일 주소만 확인
"profile" # 이름과 프로필 사진
]
```
- JWT 토큰에 profile picture 추가
- frontend-customer에서 프로필 사진 표시 지원
##### 2차 시도 - 서버 반영 문제 해결
- **문제**: 코드는 수정했지만 여전히 gmail.modify 권한 요청
- **원인**: Gitea Actions가 코드만 업데이트하고 컨테이너 재빌드 안 함
- **해결**: 51123 서버에서 수동 재배포
```bash
cd /home/admin/auth-server
git pull
docker-compose down
docker-compose up -d --build --force-recreate
```
##### 3차 시도 - Google 캐시 초기화
- **문제**: "이미 일부 액세스 권한이 있음" 메시지
- **원인**: Google이 이전 gmail.modify 권한을 기억
- **해결**:
1. https://myaccount.google.com/permissions 에서 앱 권한 삭제
2. 브라우저 시크릿 모드로 재시도
#### 결과
- ✅ 최소 권한(openid, email, profile)만 요청
- ✅ 사용자 신뢰도 향상
- ✅ Google 프로필 사진 표시 기능 추가
### 프로필 클릭 시 로그아웃 버그 수정
#### 문제 상황
- `/game` 페이지에서 프로필 아이콘 클릭 시 즉시 로그아웃됨
#### 원인 분석
- `game-layout.tsx`의 126-129번 줄에서 프로필 버튼에 `logout()` 함수 연결
```tsx
<button
onClick={(e) => {
e.stopPropagation();
logout(); // 문제!
}}
>
```
#### 해결 방법
- 클릭 가능한 버튼을 표시 전용 div로 변경
```tsx
<div
className="p-1.5 rounded-full bg-violet-100 dark:bg-violet-900/30 transition-colors cursor-default"
title={user?.name || user?.email}
>
```
#### 결과
- ✅ 프로필 클릭해도 로그아웃 안 됨
- ✅ 프로필 이미지/아이콘은 정상 표시
- ✅ 툴팁으로 사용자 정보 표시
## 교훈
### OAuth 권한 설계 원칙
1. **최소 권한 원칙**: 필요한 최소한의 권한만 요청
2. **점진적 권한 부여**: 기능별로 필요할 때 추가 권한 요청
3. **투명성**: 사용자에게 왜 해당 권한이 필요한지 명확히 설명
### 배포 검증의 중요성
1. 코드 푸시 != 배포 완료
2. 컨테이너 재빌드 확인 필수
3. 실제 실행 중인 코드 검증 필요
### 디버깅 접근법
1. 브라우저 개발자 도구에서 OAuth URL의 scope 파라미터 확인
2. 컨테이너 내부 코드 직접 확인: `docker exec`
3. Google 계정 권한 캐시 고려
### UI/UX 설계 주의점
1. 클릭 가능한 요소는 명확한 액션 필요
2. 프로필 표시와 로그아웃은 별도 UI로 분리
3. hover 효과는 클릭 가능 여부를 암시
## 참고 명령어
```bash
# auth-server 컨테이너 내부 코드 확인
docker exec auth-server cat /app/app/providers/gmail.py | grep -A 5 "SCOPES ="
# 컨테이너 재빌드 및 재시작
docker-compose down
docker-compose up -d --build --force-recreate
# 실시간 로그 모니터링
docker logs -f auth-server | grep -i "oauth\|scope"
```
## 관련 파일
- `/auth-server/app/providers/gmail.py`: OAuth 스코프 설정
- `/frontend-customer/src/contexts/auth-context.tsx`: 프로필 정보 처리
- `/frontend-customer/src/components/game-layout.tsx`: 게임 레이아웃 프로필 표시
- `/frontend-customer/src/components/user-menu.tsx`: 사용자 메뉴 (정상 동작)
---
*작성자: happybell80 with Claude*
*시간: 2025년 8월 17일 오전 1시 23분*