Skip to content

feat: 로그인 계정에 연결되지 않은 API Key 인증 거절 - #82

Merged
Whale0928 merged 2 commits into
mainfrom
feat/reject-unlinked-api-key
Oct 1, 2026
Merged

Whale0928 merged 2 commits into
mainfrom
feat/reject-unlinked-api-key

Conversation

@Whale0928

Copy link
Copy Markdown
Owner

배경

2026년 9월 10일 공지(기존 API Key 이용 안내)에서 안내한 대로, 9월 30일까지 로그인 계정에 연결되지 않은 기존 API Key는 더 이상 사용할 수 없게 합니다. 저장된 키 데이터를 일괄 만료시키는 대신 인증 단계에서만 거절하도록 해서, 기한을 놓친 사용자도 발급 이메일로 로그인하면 키 값 변경 없이 바로 다시 사용할 수 있게 합니다.

변경 내용

  • ApiKeyReader가 만료 여부에 더해 로그인 계정 연결 여부를 검사합니다. 연결되지 않은 키는 HTTP 200에 새 상태 코드 4034(API_KEY_NOT_LINKED)로 거절하며, 거절된 요청은 사용 기록을 남기지 않습니다.
  • 발급 이메일과 같은 Google 또는 GitHub 계정으로 로그인하면 기존 자동 연결 경로가 소유권을 채우므로 같은 키가 그대로 다시 통과합니다.
  • 이미 만료된 키와 로그인 계정에서 발급한 키의 동작은 바뀌지 않습니다.
  • FakeApiKeyMetadataReader에 미연결 키 목록을 추가해 슬라이스 테스트에서도 같은 규칙을 재현합니다.
  • E2E seed의 READ/WRITE 키는 seed 사용자에 연결하고, 미연결 상태 검증용 LEGACY 키를 추가했습니다.
  • 오류 모델 문서(error-model.md, authentication.md), CHANGELOG, AGENTS.md를 갱신했습니다.
  • 플랫폼·시크릿 서브모듈 참조를 원격 최신으로 올렸습니다. 이 프로젝트의 배포 구성에는 영향이 없습니다.

검증

  • ./gradlew spotlessApply staticCheck 통과
  • ./gradlew unitTest 통과
  • ./gradlew supportTest 통과 (5건)
  • ./gradlew apiE2eTest 통과 (73건)
  • 추가 테스트: ApiKeyReaderTest(미연결 키 거절), SecurityAuthenticationTest(4034 응답), ApiKeysE2ETest(거절 → 로그인 → 재허용)

배포 뒤 할 일

  • API 이미지를 릴리스해야 운영에 반영됩니다.
  • 공지 문구는 "만료"로 안내했으나 실제 동작은 "연결 전까지 차단, 로그인하면 즉시 복구"이므로 공지를 보완합니다.

2026.09.30 공지 기한이 지난 미연결 API Key를 데이터 만료 대신 인증 단계에서
막는다. 만료 검사 뒤에 user_id 연결 검사를 추가하고 새 상태 코드
4034(API_KEY_NOT_LINKED)로 거절한다. 발급 이메일로 로그인하면 기존 자동
연결 경로가 소유권을 채워 같은 키가 다시 통과한다.

- FakeApiKeyMetadataReader에 미연결 키 목록을 두어 슬라이스 테스트에서 재현
- E2E seed의 READ/WRITE 키는 seed 사용자에 연결하고 미연결 LEGACY 키를 추가
- 단위·슬라이스·E2E 테스트와 오류 문서, CHANGELOG, AGENTS.md 갱신
@Whale0928
Whale0928 merged commit 1c648fb into main Oct 1, 2026
3 checks passed
@Whale0928
Whale0928 deleted the feat/reject-unlinked-api-key branch October 1, 2026 15:17
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