본문 바로가기

스프링부트11

스프링부트 JSESSIONID URL 노출 문제 해결하기 feat.Oauth2 문제 상황Spring Boot에서 OAuth2 소셜 로그인을 구현하던 중, 세션이 만료된 상태에서 로그인을 시도하면 계속해서 알 수 없는 에러가 나는 것을 확인하였습니다. nginx 로그를 통해 원인을 분석한 결과 JSESSIONID가 URL에 노출되는 문제 때문에 oauth2 로그인 과정이 거절 되었다는 것을 알 수 있었습니다. 문제가 발생했던 Oauth2 URLhttps://example.com/oauth2/authorization/kakao;jsessionid=6A536F40C07B383860906AB325E68945 위 url의 끝에 jsessionid가 붙어있는것을 확인할 수 있고 이러한 URL rewriting은 보안상 취약점이 될 수 있으며, oauth2 url에 불필요한 jsessionid.. 2024. 10. 29.
Spring 테스트에서 @Transactional과 비관적 락 사용 시 주의점 오늘은 Spring 테스트 코드를 통해서 방 입장 동시성 문제를 해결한 비관적 락 코드를 테스트하면서 발생한 문제에 대해서 다뤄보겠습니다.문제 상황Spring에서 데이터베이스 테스트를 작성할 때, 우리는 종종 @Transactional 어노테이션을 사용합니다. 이 어노테이션은 각 테스트 메서드를 하나의 트랜잭션으로 감싸고, 테스트가 끝나면 자동으로 롤백 하여 데이터베이스를 초기 상태로 되돌립니다.이번 테스트에서는 비관적 락을 통해 5명 제한인 방에 10명이 동시에 입장을 시도하면  5명이 방에 참여를 하고 5명은 참여하지 못하는 것을 테스트 시나리오로 수립하였습니다. 그러나 생각했던 시나리오와는 달리 계속해서 lock timeout이 발생하였습니다. 원인을 파악하기전에 작성한 코드를 먼저 살펴보겠습니다... 2024. 10. 14.
스프링부트 filter에서 발생한 예외를 핸들링 해보자 어떤 문제를 해결했는가? RTR 전략을 위한 refreshToken을 재발급해 주기 위해서 기존 JWT가 만료가 되면 분기화된 에러 메세지를 사용자에게 전달해 주어야했다. 기존에 전역 에러 관리를 위한 글로벌 ExceptionHandler가 있었기에 JWT 예외가 사용자에게 전달될 것으로 생각했으나 필터에서 발생되는 예외를 처리하지 못하는 상황이 발생했다. 참고 (RTR) : https://auth0.com/docs/secure/tokens/refresh-tokens/refresh-token-rotation   그럼 ExceptionHandler는 왜 필터에서 발생된 예외를 처리하지 못했을까? 출처:https://justforchangesake.wordpress.com/2014/05/07/spring-m.. 2024. 8. 30.
스프링부트 JPA 모범 사례 - @ManyToMany 연관관계를 효과적으로 구성하는 방법 오늘은 양방향 @ManyToMany 연관관계를 효과적으로 구성하는 방법에 대해 알아보았다.먼저 양방향 @ManyToMany 연관관계는 양쪽으로부터 탐색할 수 있으므로 양쪽 모두 부모가 된다. 둘 다 부모이기 때문에 둘 중 누구도 외래 키를 보유하지 않고 연결 또는 조인 테이블로 알려진 별도의 테이블에 저장되는 2개의 외래 키를 갖는다. 이 연결 테이블은 숨겨져 있으며 자식 측 역할을 한다. 그럼 @ManyToMany 연관관계를 어떻게 하면 효과적으로 사용할 수 있을까?  1. 항상 List가 아닌 Set을 사용@ManyToMany의 대부분의  상황에서 List보다 Set의 성능이 뛰어나다. 특히 삭제 처리와 관련해 Set을 사용하고 List는 피하는 것이 좋다고 한다.  2. 연관관계의 양측 동기화 상태.. 2024. 8. 23.
토비의 스프링 3.1 Vol.1 40p ~ 143p 정리 스프링이란 무엇인가? 스프링은 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크 - 애플리케이션의 기본 틀 - 스프링 컨테이너 스프링 컨테이너는 설정정보를 참고로 해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리한다. - 공통 프로그래밍 모델 - IoC/DI, 서비스 추상화, AOP 1. IOC/DI 모델 2. 서비스 추상화 3. AOP - 기술 API 스프링은 엔터프라이즈 애플리케이션을 개발의 다양한 영역에 바로 활용할 수 있는 방대한 양의 기술 API를 제공한다. 스프링의 성공요인 - 단순함 가장 단순한 객체지향적인 개발 모델인 POJO 프로그래밍 강력 주장 - 유연성 스프링의 유연성으로 인해 다른 많은 프레임워크와 편리하게 접목돼서 사용할 수 있으며 유연성과 확장성이 매우 뛰.. 2023. 12. 28.
[책 리뷰] 스프링 부트 3 백엔드 개발자 되기 - 신선영 스프링부트 개발뿐만 아니라 배포와 CI CD까지 이르는 전체적인 과정을 경험해보기 위해서 구매한 서적이다. 나는 버전이 안정적인 출시가 된지 오래된 서적도 좋다고 생각하지만, 이왕이면 가장 최신에 나온 버전으로 학습하는 것을 선호한다. 빠르게 새로운 것을 습득해야 흐름에 뒤처지지 않는 개발자가 될 수 있다고 생각하기 때문이다. 물론 이런 흐름에도 바뀌지 않는 근본적인 책들이 있긴 하지만 이번에는 스프링부트 3으로 개발을 해보고 싶어서 구매하게 되었다. 좋았던 점 스프링부트의 원리와 테스트코드 작성까지 상세하게 설명을 해주었고 하나의 블로그를 같이 만들면서 테스트코드와 JWT, Oauth2, github action과 AWS elastic beanstalk를 이용한 CI / CD까지 경험할 수 있어서 좋았.. 2023. 9. 15.