Docs: Add troubleshooting for OAuth permission minimization and profile bug fix
- Google OAuth 과도한 권한 문제 해결 과정 - gmail.modify 제거하고 최소 권한으로 변경 - 서버 배포 반영 문제 및 해결 방법 - 프로필 클릭 시 로그아웃 버그 수정 - 교훈 및 참고 명령어 정리
This commit is contained in:
parent
bf9c3aff3a
commit
28067881be
136
troubleshooting/250817_happybell80_OAuth권한최소화및프로필버그수정.md
Normal file
136
troubleshooting/250817_happybell80_OAuth권한최소화및프로필버그수정.md
Normal file
@ -0,0 +1,136 @@
|
||||
# 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분*
|
||||
Loading…
x
Reference in New Issue
Block a user