o2o-site-AEO/solution/frontend
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
..
public [feat] solution/frontend,site: 파비콘을 PNG 로 — 발행본·앱 양쪽에 건다 2026-09-15 17:32:03 +09:00
src [feat] solution,deploy: 카카오 로그인을 인가 코드 교환으로 — 시크릿을 서버에 가둔다 2026-09-30 16:51:05 +09:00
tests [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
.env.example [feat] solution: 네이버 플레이스를 검색 단계에서 찾는다 — 로그인은 수집 직전 한 번 2026-09-03 16:37:12 +09:00
components.json 이름: solution/front → solution/frontend 2026-08-31 15:27:16 +09:00
eslint.config.js [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
orval.config.ts [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
package.json [feat] solution/frontend,nginx: 랜딩·요금·사례를 프리렌더 — 크롤러가 빈 종이를 받던 것 2026-09-07 11:30:27 +09:00
react-router.config.ts [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
tsconfig.json [refactor] solution,nginx: 에디터와 발행본을 한 렌더러로 — 보는 그대로 나간다 2026-09-09 17:09:28 +09:00
vite.config.ts [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00