- 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/*)
4.2 KiB
4.2 KiB
250817_happybell80_OAuth권한최소화및프로필버그수정
오전 1시 23분
Google OAuth 과도한 권한 문제 해결
문제 상황
- 사용자가 Google OAuth 로그인 시 Gmail 전체 권한 요청 화면이 나타남
gmail.modify스코프가 요청되어 사용자가 거부 (access_denied)- 단순 로그인에 이메일 읽기/쓰기/삭제 권한은 과도함
원인 분석
- auth-server의
app/providers/gmail.py에서 과도한 스코프 요청
SCOPES = [
"openid",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/gmail.modify", # 문제!
]
gmail.modify는 사용자의 모든 이메일에 대한 읽기/쓰기/삭제 권한- 로그인 목적에는 완전히 불필요한 권한
해결 과정
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 권한을 기억
- 해결:
- https://myaccount.google.com/permissions 에서 앱 권한 삭제
- 브라우저 시크릿 모드로 재시도
결과
- ✅ 최소 권한(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 권한 설계 원칙
- 최소 권한 원칙: 필요한 최소한의 권한만 요청
- 점진적 권한 부여: 기능별로 필요할 때 추가 권한 요청
- 투명성: 사용자에게 왜 해당 권한이 필요한지 명확히 설명
배포 검증의 중요성
- 코드 푸시 != 배포 완료
- 컨테이너 재빌드 확인 필수
- 실제 실행 중인 코드 검증 필요
디버깅 접근법
- 브라우저 개발자 도구에서 OAuth URL의 scope 파라미터 확인
- 컨테이너 내부 코드 직접 확인:
docker exec - Google 계정 권한 캐시 고려
UI/UX 설계 주의점
- 클릭 가능한 요소는 명확한 액션 필요
- 프로필 표시와 로그아웃은 별도 UI로 분리
- 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분