배경
레거시 v1 인증 경로가 소셜 토큰 검증을 거치지 않고 인증을 통과시킬 수 있는 구조로 남아 있었다. 함께 남아 있던 이메일/비밀번호 계열 로직(계정 복구 포함)도 같은 성격의 문제를 안고 있었다.
추가로 카카오 로그인이 액세스 토큰을 발급한 앱을 구분하지 않아, 우리 앱에서 발급되지 않은 토큰도 수용될 여지가 있었다. 카카오 토큰은 발급한 앱 안에서만 유효하지만 사용자 정보 조회 자체는 성공하므로, 발급 앱을 대조하지 않으면 걸러지지 않는다.
완료된 작업
PR: bottle-note/bottle-note-api-server#674 (merged)
제거
POST /api/v1/oauth/login
POST /api/v1/oauth/restore (계정 복구)
- 이메일/비밀번호(BASIC) 로직 일체 —
SocialType.BASIC, User.password 필드, 관련 DTO·서비스
- 미사용 테스트 더블 정리
추가
- 카카오 액세스 토큰의 발급 앱 검증 — 사용자 정보를 조회하기 전에 토큰이 우리 앱에서 발급된 것인지 대조하고, 아니면 401로 거부한다.
POST /api/v2/auth/reissue, PUT /api/v2/auth/token/verify — v1과 동작이 같은 복제본. FE 전환을 지원하기 위한 것으로, 로직은 동일 서비스를 공유한다.
결과
로그인 수단이 카카오·애플 v2 두 가지로 단일화됐다.
API 현황
| 엔드포인트 |
상태 |
POST /api/v2/auth/{kakao,apple} |
유일한 로그인 경로 |
POST /api/v2/auth/reissue |
신규 (v1과 동일) |
PUT /api/v2/auth/token/verify |
신규 (v1과 동일) |
POST /api/v1/oauth/reissue |
유지 — FE 전환 후 제거 예정 |
PUT /api/v1/oauth/token/verify |
유지 — FE 전환 후 제거 예정 |
POST /api/v1/oauth/login |
제거됨 |
POST /api/v1/oauth/restore |
제거됨 |
검증 — 개발 환경 완료
개발 환경 배포 후 아래를 실제로 확인했다.
| 항목 |
결과 |
| 기동 및 설정 주입 |
정상 |
| 정상 카카오 로그인 |
200 |
| 타 카카오 앱에서 발급된 토큰 제출 |
401, 서버 로그에 발급 앱 불일치 기록 확인 |
| v1 로그인 경로 제거 |
핸들러 없음 확인 |
| 토큰 재발급 v1·v2 병존 |
양쪽 정상 동작 |
이 변경 전이었다면 마지막 케이스의 토큰은 그대로 통과했을 것이다.
남은 작업
배경
레거시 v1 인증 경로가 소셜 토큰 검증을 거치지 않고 인증을 통과시킬 수 있는 구조로 남아 있었다. 함께 남아 있던 이메일/비밀번호 계열 로직(계정 복구 포함)도 같은 성격의 문제를 안고 있었다.
추가로 카카오 로그인이 액세스 토큰을 발급한 앱을 구분하지 않아, 우리 앱에서 발급되지 않은 토큰도 수용될 여지가 있었다. 카카오 토큰은 발급한 앱 안에서만 유효하지만 사용자 정보 조회 자체는 성공하므로, 발급 앱을 대조하지 않으면 걸러지지 않는다.
완료된 작업
PR: bottle-note/bottle-note-api-server#674 (merged)
제거
POST /api/v1/oauth/loginPOST /api/v1/oauth/restore(계정 복구)SocialType.BASIC,User.password필드, 관련 DTO·서비스추가
POST /api/v2/auth/reissue,PUT /api/v2/auth/token/verify— v1과 동작이 같은 복제본. FE 전환을 지원하기 위한 것으로, 로직은 동일 서비스를 공유한다.결과
로그인 수단이 카카오·애플 v2 두 가지로 단일화됐다.
API 현황
POST /api/v2/auth/{kakao,apple}POST /api/v2/auth/reissuePUT /api/v2/auth/token/verifyPOST /api/v1/oauth/reissuePUT /api/v1/oauth/token/verifyPOST /api/v1/oauth/loginPOST /api/v1/oauth/restore검증 — 개발 환경 완료
개발 환경 배포 후 아래를 실제로 확인했다.
이 변경 전이었다면 마지막 케이스의 토큰은 그대로 통과했을 것이다.
남은 작업
users.password컬럼 DROP 마이그레이션 — 엔티티 필드만 제거했고 컬럼은 남아 있다.