# Gmail refresh_token 컬럼/JSONB 불일치 문제 **작성일**: 2025-09-09 **작성자**: happybell80 & Claude **영향 서비스**: skill-email, auth-server ## 문제 상황 Gmail 토큰 테이블에서 refresh_token이 두 곳에 저장: - `refresh_token` 컬럼 (오래된 무효 토큰) - `token_data` JSONB (실제 유효 토큰) ## 발견 과정 ```python # refresh_token 컬럼 토큰 테스트 토큰: 1//0g53CfEfA9Pw6... 결과: 400 invalid_grant (만료/무효) # token_data JSONB 토큰 테스트 토큰: 1//0glv3xMaPHgvW... 결과: 200 OK (정상 작동) ``` ## DB 현황 (23:36 갱신) 김종태: token_data와 컬럼 불일치 (다른 토큰) Heejae: 양쪽 일치 (동일 토큰) HanYong: token_data 비어있음 (8/30 이후) ## 코드 분석 ### skill-email (문제) - 63번: refresh_token 컬럼 조회 → 무효 토큰 사용 - 166번: 컬럼만 업데이트 → JSONB 동기화 안됨 ### auth-server (정상) - token_data JSONB 사용 중 ## 해결 방안 ```sql -- 1. 긴급: DB 동기화 (무효 토큰 문제 즉시 해결) UPDATE gmail_tokens SET refresh_token = token_data->>'refresh_token', access_token = token_data->>'access_token' WHERE token_data IS NOT NULL; -- 2. 근본: skill-email 코드 JSONB 전환 -- 63번: token_data->>'refresh_token' as refresh_token -- 166번: token_data = jsonb_set(...) 사용 ``` ## 교훈 - 레거시 컬럼과 JSONB 병행 사용 시 동기화 필수 - 코드 마이그레이션 시 모든 서비스 일괄 수정 - 토큰 갱신 실패 시 저장 위치 불일치 확인