[관련 커밋]
https://github.com/all-in-market/mvp-api-server/commit/91ba7e2599fb64e2452e518b2c3aa0f91d0a129b
Merge pull request #144 from all-in-market/fix/login-control · all-in-market/mvp-api-server@91ba7e2
feat: 구매자 로그인 실패 사유 비노출, 로깅
github.com
[관련 게시물]
https://montmer27.tistory.com/243
[트러블슈팅] 무차별 대입 공격으로부터 로그인 방어하기
[상황]현재 구조에서는 로그인 실패 사유를 자세히 알려주고 있다. 이 구조는 일반 사용자에겐 편리함을 제공하지만 악의적인 사용자에게는 계정 정보를 유추할 수 있는 단서를 제공한다.[목표]
montmer27.tistory.com
[상황]
위 커밋 머지 후 CD 환경에서 아래와 같은 에러 발생
Parameter 1 of constructor in com.example.allinmarket.common.security.LoginRateLimitFilter required a bean of type 'com.fasterxml.jackson.databind.ObjectMapper' that could not be found.
[원인]
LoginRateLimitFilter에 ObjectMapper가 생성자 주입으로 연결되어 있는데, Spring Boot 자동 설정이 모든 배포 환경에서 항상 ObjectMapper 빈을 등록해주지는 않는다.
Spring Boot의 JacksonAutoConfiguration은 자동으로 ObjectMapper 빈을 등록하지만, 이는 조건부 자동 설정(@ConditionalOnMissingBean)이라 특정 배포 환경, Docker 이미지 빌드 방식, 또는 Spring Boot 버전에 따라 실행 순서 문제로 빈이 누락될 수 있다고 한다.
[해결]
/common/config/JacksonConfig.java에 @Bean ObjectMapper를 명시적으로 등록했다. 자동 설정에 의존하지 않으므로 CD 환경에서도 항상 안정적으로 빈이 등록된다. JavaTimeModule도 함께 등록해 LocalDate 등 Java 8 날짜 타입 직렬화도 올바르게 처리된다.
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper()
.registerModule(new JavaTimeModule())
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}
}'Projects > [Final] Shopping Mall Project' 카테고리의 다른 글
| [기능구현] 최종 결제 및 주문 유일성 제약 적용하기 (2부) (0) | 2026.04.27 |
|---|---|
| [기능구현] 최종 결제 및 주문 유일성 제약 적용하기 (1부) (0) | 2026.04.27 |
| [트러블슈팅] 무차별 대입 공격으로부터 로그인 방어하기 (0) | 2026.04.27 |
| [트러블슈팅] 로그아웃 API에서 인증, 무효화 구현하기 (0) | 2026.04.27 |
| [테스트] influxdb + grafana로 k6 부하 테스트 실행하기 (0) | 2026.04.23 |