Skip to content

[Fix#6] JWT 키 검증·비밀번호 오류·로그인 시도 제한 - #8

Merged
hrxlou merged 1 commit into
developfrom
fix/login-security#6
Oct 2, 2026
Merged

hrxlou merged 1 commit into
developfrom
fix/login-security#6

Conversation

@hrxlou

@hrxlou hrxlou commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Summary

JWT 기본키로 서버가 실행되거나, BCrypt가 72바이트 이후의 입력을 무시해 다른 비밀번호를 인증하거나, 로그인 실패 요청을 제한 없이 반복할 수 있는 문제를 수정했습니다.
서버 실행 시 JWT 키를 검증하고, 비밀번호 한계 초과 입력은 400으로 거부하며, 계정·IP별 로그인 제한은 429와 Retry-After로 안내합니다.

Tasks

  • JWT 키 기본값을 제거하고, 누락·빈 값·32바이트 미만·기존 기본값 사용 시 서버 시작을 거부합니다.
  • Spring Boot를 같은 3.3 계열의 3.3.13으로 업데이트했습니다. 최종 의존성과 JAR의 spring-security-crypto는 6.3.10입니다.
  • 회원가입·로그인에 UTF-8 바이트 검증을 적용했습니다. 72바이트 입력은 허용하고 초과 입력은 400으로 반환합니다. 내부 PasswordEncoder도 초과 입력의 해시 생성과 인증을 막습니다.
  • 계정별 최근 15분의 실패 5회 이후 15분 제한, IP별 1분에 로그인 요청 30회 제한을 기본값으로 적용했습니다. 기준은 환경변수로 조절할 수 있습니다.
  • 동시 요청의 인증 작업을 예약해 실패 한도를 우회하지 못하도록 처리했습니다. 정상 로그인은 계정 실패 횟수를 초기화하고, 내부 오류는 실패로 집계하지 않습니다.
  • 일반 로그인 실패는 계정 존재 여부와 관계없이 같은 401 응답을 반환합니다. 알 수 없는 계정도 BCrypt 검증을 수행합니다.
  • 연결 IP를 기본으로 사용하고, 명시적으로 신뢰한 프록시에서 온 요청만 CF-Connecting-IP를 사용합니다. 임의 전달 헤더로 제한을 우회하지 못하도록 처리했습니다.
  • 실행 설정·제한 기준을 README에, 비밀번호 오류·로그인 401·429 및 재시도 헤더를 Swagger/OpenAPI에 반영했습니다.

Verification

  • GitHub Actions Java 17에서 mvn -B -ntp verify가 통과했다 (33개 테스트, 실패·오류·스킵 없음)
  • 로컬 Java 21에서 Java 17 대상 mvn -B -ntp verify가 통과했다 (33개 테스트)
  • API 변경 시 OpenAPI 문서를 함께 갱신했다 — 실제 /v3/api-docs 응답을 테스트로 확인했습니다
  • DB 스키마 변경 없이 기존 Spring Security 6.3.4로 생성한 정상 BCrypt 해시의 로그인을 확인했습니다
  • JWT 설정에 따른 시작 성공·실패, 다른 키 서명·만료 토큰 거부를 검증했습니다
  • ASCII·한글·이모지의 72바이트 경계와 초과 입력, 계정·IP 변경, 제한 해제, 동시 요청, 전달 헤더 위조를 검증했습니다

To Reviewer

로그인 제한은 단일 프로세스 메모리에서 관리하므로 재시작하면 초기화됩니다. 추적 항목 수에는 상한이 있고, 한도 초과 시 기존 제한을 삭제하지 않고 새 항목에 429를 반환합니다. 여러 인스턴스로 확장할 때는 공유 저장소가 필요합니다.

#7에서 Cloudflare Tunnel을 연결할 때 백엔드 직접 접근을 차단하고 실제 프록시 연결 IP만 LOGIN_TRUSTED_PROXY_ADDRESSES에 지정해야 사용자별 IP 제한이 적용됩니다. 배포 서버에는 별도 무작위 JWT_SECRET을 설정해야 합니다.

@hrxlou hrxlou self-assigned this Oct 2, 2026
@hrxlou
hrxlou merged commit 0d2bb49 into develop Oct 2, 2026
1 check passed
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.

[Fix] 로그인 보안 개선 (JWT 비밀키·비밀번호 검증·시도 제한)

1 participant