Skip to content

MSG-452 fix: 앱 카카오 로그인 401 해소, 네이티브 앱 키를 aud로 허용 - #198

Merged
s13121312 merged 1 commit into
developfrom
feature/MSG-452-kakao-app-aud
Aug 21, 2026
Merged

MSG-452 fix: 앱 카카오 로그인 401 해소, 네이티브 앱 키를 aud로 허용#198
s13121312 merged 1 commit into
developfrom
feature/MSG-452-kakao-app-aud

Conversation

@s13121312

@s13121312 s13121312 commented Aug 21, 2026

Copy link
Copy Markdown
Member

🎫 관련 티켓

작업 내용

  • 카카오 OIDC ID 토큰 검증의 aud1 허용 대상을 REST API 키 하나에서 REST API 키 + 네이티브 앱 키 두 개로 확장했다. 모바일 앱(카카오 네이티브 SDK) 경로의 로그인이 401(developCode 2421)로 거부되던 문제의 수정이다 (FE 실기 검증은 MSG-444 코멘트 참고)
  • KakaoOidcPropertiesappClientId 필드를 추가했다. 값은 application.yml에 직접 뒀다 — 네이티브 앱 키는 APK에 포함되는 공개 식별자라 시크릿이 아니고, 덕분에 배포 환경변수 변경이 없다
  • audience 검증을 OidcDecoderConfig.audienceValidator(Set) 정적 메서드로 추출하고 단위 테스트 3건을 새로 넣었다 (웹 REST 키 통과 / 앱 네이티브 키 통과 / 미허용 키 거부)

변경 파일 (6개, +69/−8):

src/main/java/com/msg/fillmap/auth/oidc/OidcDecoderConfig.java    | 19 +++--
src/main/java/com/msg/fillmap/auth/oidc/KakaoOidcProperties.java  |  2 +
src/main/resources/application.yml                                |  2 +
src/test/.../auth/oidc/OidcDecoderConfigTest.java (신규)          | 48 ++++
src/test/.../auth/controller/AuthControllerTest.java              |  2 +-
src/test/.../auth/oidc/KakaoAuthCodeExchangerTest.java            |  4 +-

🤔 고민한 내용

  • 원인: 카카오는 인가를 요청한 앱 키를 그대로 ID 토큰 aud에 넣는다. 웹은 REST API 키로 인가받아 통과했지만, 앱은 네이티브 SDK가 네이티브 앱 키로 인가받아 같은 카카오 애플리케이션(필맵)인데도 aud가 플랫폼별로 갈린다. 서버 검증이 REST 키 하나만 허용해서 앱 토큰이 전부 거부됐다
  • 네이티브 앱 키를 env 주입으로 할지 yml 리터럴로 할지: REST 키는 인가 코드 교환의 client_id로도 쓰는 자격 성격이라 env 주입이지만, 네이티브 앱 키는 aud 대조에만 쓰는 공개 식별자라 yml 리터럴을 택했다
  • 바인딩부터 디코더 조립까지의 통합 테스트는 넣지 않았다: yml 바인딩과 @notblank는 기존 @SpringBootTest들이 부팅 시점에 이미 강제하고, 남는 미검증분이 Set.of(clientId, appClientId) 한 줄이라 JWKS 서명 테스트 인프라 신설 비용 대비 이득이 없다고 봤다

👀 리뷰 포인트

  • app-client-id를 yml 리터럴로 둔 판단 — env 주입 선호면 바꿀 수 있다
  • 허용 aud 확장의 보안 경계 — 두 키 모두 같은 카카오 앱(앱 ID 1501266) 소속이라 신뢰 범위가 넓어지지 않는다고 판단했다

Footnotes

  1. aud(audience): ID 토큰이 "누구에게 발급된 토큰인지"를 담는 클레임. 검증 서버는 자기 앱 키가 aud에 있는지 대조해 남의 앱에 발급된 토큰을 걸러낸다.

@claude

claude Bot commented Aug 21, 2026

Copy link
Copy Markdown

Claude finished @s13121312's task in 1m 40s —— View job


작업 목록

  • 컨텍스트 확보 (PR 본문, diff 통계)
  • origin/develop 대조 — 병렬 브랜치 경합 확인
  • 스펙 문서 대비 구현 확인
  • 실행 시 드러나는 결함 확인 (트랜잭션·동시성·시간대·인가 등)
  • PR 본문 주장 검증
  • 리뷰 결과 정리 및 게시

확인한 범위

  • origin/develop 대조: 마이그레이션 변경 없음, developCode 대역(auth=2xxx) 신규 추가 없음(기존 2421 INVALID_ID_TOKEN 그대로 사용), Owner A/B 계약 인터페이스 변경 없음 — 병렬 경합 소지 없음
  • docs/spec/MSG-452.md 부재 확인 — 기존 요구사항(카카오 로그인) 복구형 버그 수정이라 CLAUDE.md의 PRD/스펙 면제 기준에 해당, 문제 없음
  • kakaoJwtDecoder 빈이 웹(코드 교환 경유)·앱(네이티브 SDK id_token 직접 전달, AuthController:116) 두 경로에서 공유되는 단일 검증 지점임을 확인 — 수정이 실제 401 발생 경로를 정확히 겨냥함
  • audienceValidator 로직(anyMatch), 신규 단위테스트 3건, 기존 테스트 2건의 생성자 인자 반영 모두 일치
  • PR 본문 주장("env 변경 없음", "같은 카카오 앱이라 신뢰 범위 안 넓어짐") — application.yml diff와 일치, clientId/appClientId 사용처가 각각 코드 교환·인가 리다이렉트 vs aud 검증으로 분리되어 있음을 확인

발견 사항 없음.

@github-actions

Copy link
Copy Markdown

테스트 커버리지

Overall Project 94.82% 🍏
Files changed 100% 🍏

File Coverage
OidcDecoderConfig.java 100% 🍏
KakaoOidcProperties.java 100% 🍏

@s13121312
s13121312 merged commit c13a377 into develop Aug 21, 2026
2 checks passed
@s13121312
s13121312 deleted the feature/MSG-452-kakao-app-aud branch August 21, 2026 02:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant