# Email Skill 인증 오류 및 Cron 토큰 문제

**작성일**: 2025-09-13  
**작성자**: happybell80 & Claude  
**영향 서비스**: skill-email, rb8001  
**심각도**: 높음  

## 1. 문제 상황

### Email Skill HTTP 500 오류
- **증상**: skill_email 서비스가 HTTP 500 반환
- **에러**: `No credentials found for user: 0914eagle@gmail.com`
- **실제 결과**: 
  - happybell80/김종태 (goeun2dc@gmail.com) - ✅ 성공 (HTTP 200)
  - 0914eagle/전희재 (0914eagle@gmail.com) - ❌ 실패 "Refresh token revoked"
  - cdctfm/HanYong (cdctfm@gmail.com) - ❌ 실패 "No access token found"

### Cron 트리거 권한 오류
- **증상**: `Unauthorized cron trigger attempt` 경고 발생
- **위치**: rb8001/main.py:558
- **문제**: 인증 실패에도 요청 처리 계속됨 (보안 취약)

## 2. 원인 분석

### Email 인증 실패 원인
```python
# skill-email/services/gmail_service.py:49
if creds_result is None:
    return Err(EmailError(f"No credentials found for user: {user_id}"))

# skill-email/services/db_credentials_provider.py:67
SELECT token_data->>'refresh_token' as refresh_token
FROM gmail_token  # 테이블명 맞음: 실제 DB도 gmail_token (단수형)
WHERE slack_user_id = %s AND is_equipped = true
```

1. **테이블명 일치**: 코드와 DB 모두 `gmail_token` 단수형
2. **is_equipped 현황**: 3명 전원 true (happybell80, 0914eagle, cdctfm)
3. **실제 원인**: 
   - happybell80: 토큰 유효 → 성공
   - 0914eagle: refresh_token 취소됨 → 재인증 필요
   - cdctfm: token_data=NULL → 신규 인증 필요

### Cron 인증 취약점
```python
# rb8001/main.py:556-560
expected_token = settings.CRON_TOKEN if hasattr(settings, 'CRON_TOKEN') else "cron-secret-2024"

if auth_header != f"Bearer {expected_token}":
    logger.warning("Unauthorized cron trigger attempt")
    # raise HTTPException(status_code=401, detail="Unauthorized")  # 주석 처리됨!
```

- 하드코딩된 기본 토큰 사용
- 인증 실패시 경고만 기록, 요청은 계속 처리

## 3. 관련 문서 참조

- **250909**: gmail_refresh_token 컬럼/JSONB 불일치 해결
- **250825**: Gmail 토큰 만료 문제 (동일 사용자 3명)
- **250801**: 크론잡 로그 동기화 설정

## 4. 해결 방안

### 즉시 조치 (로컬 개발자)
```python
# 1. 실제 상태 확인됨:
# - happybell80: ✅ 토큰 유효, 정상 동작
# - 0914eagle: ❌ "Refresh token revoked" → 재인증 필요
# - cdctfm: ❌ "No access token found" → 신규 인증 필요

# 2. 슬랙 메시지의 이메일 내용:
# - 김종태님: 실제 이메일 (Google 보안알림, xAI 인보이스)
# - 전희재님: 캐시 또는 더미 데이터 추정
```

### 서버 작업 필요 (서버 관리자)
```sql
-- 실제 필요 작업:
-- 1. happybell80: 정상 동작 중 (작업 불필요)
-- 2. 0914eagle: Gmail 재인증 필요 (refresh_token 취소됨)
-- 3. cdctfm: Gmail 신규 인증 필요 (token 없음)

-- DB 정합성 수정
UPDATE gmail_token 
SET is_equipped = false 
WHERE slack_user_id IN ('0914eagle', 'cdctfm');
```

## 5. 교훈

1. **실제 결과**: happybell80만 성공, 나머지 2명 재인증 필요
2. **refresh_token revoked**: Google이 토큰 취소 → 재인증만 해결책
3. **슬랙 메시지 모순**: 실패했는데 이메일 내용 표시 → 캐시/더미 데이터
4. **DB 정합성**: is_equipped=true이지만 실제 토큰 상태와 불일치