유대선
프로젝트로
·트러블슈팅·3 ·리뷰 필요

카카오 로그인 실연동: KOE006 → KOE010 까지, 그리고 직접 OAuth 결정

사양의 '카카오는 제너릭 OAuth로'를 Better Auth 없이 직접 구현해 lib/auth 인터페이스에 끼움. 실제 키로 KOE006(redirect 미등록)·KOE010(client_secret 누락) 두 관문을 넘어 로그인 성공.

AI 버전

결정: Better Auth 대신 직접 OAuth

사양(§16)은 "Better Auth + 카카오/애플, 카카오는 제너릭 OAuth로". 카카오는 BA의 1급 제공자가 아니라 어차피 제너릭 설정이 필요하고, lib/auth가 이미 깔끔한 인터페이스라 직접 OAuth(2개 라우트) 가 더 단순·신뢰성↑로 판단. 인증 공통 로직은 establishUser()로 추출해 dev 로그인과 카카오가 공유.

  • 흐름: /api/auth/kakao(state 쿠키 + authorize 리다이렉트) → 카카오 동의 → /api/auth/kakao/callback(state 검증 → 토큰 교환 → 사용자 조회 → establishUser('kakao:<id>', nickname) → 세션 쿠키 → /box).
  • 최소 수집: 카카오 사용자 id + 닉네임만. 이메일·전화 요청 안 함(= 사업자 인증 불필요, 신뢰에도 유리).
  • 커밋: 8899c09(구현), 71db46b(디버깅 로깅).

더미 키로 사전 검증

실제 키 받기 전, 더미 키로: authorize 리다이렉트 URL·파라미터·state 쿠키, 콜백 에러 경로(kakao_denied/state_mismatch), 버튼 노출 조건, dev 로그인 공존을 확인.

실제 키 — 관문 1: KOE006

Admin Settings Issue (KOE006)
An error in the 버팀목 service settings prevents the service from being used.
  • 원인(검증): 정확한 Redirect URI(http://localhost:3000/api/auth/kakao/callback)가 콘솔에 미등록. (카카오 문서: "리다이렉트 URI가 올바르지 않은 경우 KOE006".)
  • 수정: 콘솔 [플랫폼 키]→[REST API 키]→[리다이렉트 URI]에 정확히 등록 + 카카오 로그인 ON. (콘솔 설정, 코드 변경 없음.)
  • 콘솔 메뉴가 글의 옛 설명과 달라서, 공식 문서를 다시 확인해 현재 경로로 안내. (나는 공개 docs를 읽었을 뿐, 사용자의 로그인된 콘솔을 직접 보진 못함 — 막힌 화면은 스크린샷으로 확인.)

실제 키 — 관문 2: KOE010

로그인창·동의는 통과, 콜백에서 실패. 처음엔 원인 미상이라 상세 로깅을 추가(71db46b):

[kakao callback] kakao token exchange 401: {"error":"invalid_client","error_description":"Bad client credentials","error_code":"KOE010"}
  • 원인(검증): 앱에 Client Secret이 ON인데 토큰 요청에 client_secret 미포함. (REST 키는 정상 — 앱명 "버팀목" 렌더 + KOE006 이미 통과로 확인.)
  • 수정: .env.localKAKAO_CLIENT_SECRET 추가(gitignored). kakaoExchangeToken은 있으면 자동 포함.

성공 (서버 로그로 확인)

GET /api/auth/kakao/callback?code=…&state=… 307 (토큰 교환 2.2s)
GET /box 200

실제 카카오 계정으로 kakao:<id> 보관함 생성·진입. → 신뢰 1순위 "본인 인증된 진짜 소유" 달성.

패턴

  • KOE006 = redirect URI 미등록/오타(scheme·host·port·path 정확히, localhost127.0.0.1).
  • KOE010 invalid_client (KOE006 해결 후) = Client Secret이 ON인데 미전송.
  • 외부 API 디버깅은 추측 말고 응답 본문을 로그로 찍어서 잡는다 — KOE010은 로깅 추가 한 번으로 즉시 특정됐다.

리뷰 필요

내 시각이 아직 안 들어간 entry.