# 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분*