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

4.2 KiB

250817_happybell80_OAuth권한최소화및프로필버그수정

오전 1시 23분

Google OAuth 과도한 권한 문제 해결

문제 상황

  • 사용자가 Google OAuth 로그인 시 Gmail 전체 권한 요청 화면이 나타남
  • gmail.modify 스코프가 요청되어 사용자가 거부 (access_denied)
  • 단순 로그인에 이메일 읽기/쓰기/삭제 권한은 과도함

원인 분석

  1. auth-server의 app/providers/gmail.py에서 과도한 스코프 요청
SCOPES = [
    "openid",
    "https://www.googleapis.com/auth/userinfo.email",
    "https://www.googleapis.com/auth/gmail.modify",  # 문제!
]
  1. gmail.modify는 사용자의 모든 이메일에 대한 읽기/쓰기/삭제 권한
  2. 로그인 목적에는 완전히 불필요한 권한

해결 과정

1차 시도 - 코드 수정
  • auth-server의 스코프를 최소 권한으로 변경
SCOPES = [
    "openid",
    "email",     # 이메일 주소만 확인
    "profile"    # 이름과 프로필 사진
]
  • JWT 토큰에 profile picture 추가
  • frontend-customer에서 프로필 사진 표시 지원
2차 시도 - 서버 반영 문제 해결
  • 문제: 코드는 수정했지만 여전히 gmail.modify 권한 요청
  • 원인: Gitea Actions가 코드만 업데이트하고 컨테이너 재빌드 안 함
  • 해결: 51123 서버에서 수동 재배포
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() 함수 연결
<button 
  onClick={(e) => {
    e.stopPropagation();
    logout();  // 문제!
  }}
>

해결 방법

  • 클릭 가능한 버튼을 표시 전용 div로 변경
<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 효과는 클릭 가능 여부를 암시

참고 명령어

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