o2o-site-AEO/solution/backend/common
hbyang 3253166622 [feat] solution,deploy: 카카오 로그인을 인가 코드 교환으로 — 시크릿을 서버에 가둔다
콘솔에 발급된 설정이 설계와 어긋나 있었다. 클라이언트 시크릿이 켜져 있고 Redirect URI 가
프론트 경로(/auth/kakao/callback)인데, 코드는 "프론트가 액세스 토큰을 들고 온다" 는
전제였다 — 시크릿을 번들에 구울 수 없으므로 그 흐름으로는 토큰을 받을 수 없다.

- services/external/kakao_identity: access_token 검증 → **인가 코드 교환**으로 교체.
  ★ 우리 REST 키·시크릿으로 교환한 토큰이라 정의상 우리 앱 것이다 — 구글의 aud 대조에
    해당하는 검사(KAKAO_LOGIN_APP_ID)가 구조적으로 필요 없어져 설정 칸째로 지웠다.
  ★ 로그인 앱과 챗봇 앱이 다르면 로그인은 되는데 채널 매칭만 조용히 안 된다 —
    REST 키가 어긋나면 경고 로그를 남긴다.
  ★ 미인증 이메일은 신원으로 쓰지 않는다(is_email_valid·is_email_verified 둘 다). 이 값으로
    auth_service 가 다른 수단 가입과의 충돌을 판정한다.
- config/config_models: KAKAO_LOGIN_APP_ID → REST_API_KEY · CLIENT_SECRET · REDIRECT_URI
- router/v1/auth: Req_KakaoLogin {access_token} → {code, redirect_uri}
- frontend: lib/kakaoIdentity(인가 URL · sessionStorage state) · KakaoSignInButton ·
  pages/KakaoCallbackPage(코드는 1회용이라 ref 로 한 번만 보낸다) · routes
  ★ 로그인 폼에서 카카오를 구글 위에 둔다 — 이 수단으로 들어와야 6자리 코드 없이 채널이 이어진다
- compose · nginx/Dockerfile: REST 키·Redirect URI 만 프론트로 흘려보낸다. 시크릿은 안 나간다
- 어드민 키는 저장하지 않는다 — 탈퇴까지 되는 키인데 로그인에는 쓰이지 않는다
- api/generated: orval 재생성. 카카오 외에도 오래 밀려 있던 문구·agent 경로가 함께 따라왔다

테스트 8건 추가(tests/test_kakao_identity.py), 관련 85 passed
(test_auth::test_google_login_is_off_when_client_id_is_empty 는 기존 실패)
lint(react-router typegen + tsc + eslint) 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-30 16:51:05 +09:00
..
category_schema [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
database [fix] solution/backend: DB 엔진 생성 로그에서 비밀번호 제거 — 호스트·포트·DB 이름만 남긴다 2026-09-30 14:07:40 +09:00
faq_catalog [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
models [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
utils [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
authz.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
collect_diagnostics.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
cost.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
enums.py [feat] solution,deploy: 카카오 로그인을 인가 코드 교환으로 — 시크릿을 서버에 가둔다 2026-09-30 16:51:05 +09:00
job_errors.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
logger.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
singleton.py 구조: 사장님(solution)과 내부 운영(admin)을 두 앱으로 가른다 2026-08-31 15:12:09 +09:00
template_catalog.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00