현재 개발 중인 프로젝트에서 Spring Security와 JWT를 이용해 로그인 로직을 구현하고 있다. 구현 중 인증(Authentication) 예외와 JWT 예외 처리를 따로 분리하기 위한 과정을 정리해 보았다. 🔙 이전 진행사항 [Spring Security] SecurityConfig permitAll() 적용 안 되는 이유Spring Security를 도입하면 SecurityConfig 클래스 파일에서 웹 애플리케이션의 인증(Authentication) 및 권한 부여(Authorization) 메커니즘을 설정하고 관리하게 된다. 🌱 SecurityConfig.class@RequiredArgsConstructor@Conchaewsscode.tistory.com [Spring Security]..
Back-end
현재 개발 중인 프로젝트에서 Spring Security와 JWT를 이용해 로그인 로직을 구현하고 있다. 구현 중 SecurityConfig의 permitAll() 메서드와 JwtAuthenticationFilter의 shoudNotFilter() 메서드의 효율적인 관리를 위한 과정을 정리해 보았다. 🔙 이전 진행사항 [Spring Security] SecurityConfig permitAll() 적용 안 되는 이유Spring Security를 도입하면 SecurityConfig 클래스 파일에서 웹 애플리케이션의 인증(Authentication) 및 권한 부여(Authorization) 메커니즘을 설정하고 관리하게 된다. 🌱 SecurityConfig.class@RequiredArgsConstruct..
Spring Security를 도입하면 SecurityConfig 클래스 파일에서 웹 애플리케이션의 인증(Authentication) 및 권한 부여(Authorization) 메커니즘을 설정하고 관리하게 된다. 🌱 SecurityConfig.class@Configurationpublic class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .addFilterBefore(new jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) ..
Postman은 API 개발 및 테스트를 위한 협업 플랫폼이자 API 클라이언트로 주로 웹 API를 테스트하고 디버깅하는 데 사용된다. Postman에서 API 테스트를 할 때 API가 accessToken과 같은 다른 API(로그인 API, 토큰 재발급 API 등)의 결괏값을 파라미터로 사용하는 경우, 결괏값이 변경될 때마다(토큰 유효기간 만료 혹은 재로그인) 포스트맨의 환경변수 값을 변경해주어야 하는 불편함이 있다.내가 개발하는 프로젝트는 JWT 토큰 인증 방식을 사용하기 때문에 로그인 후 JWT 토큰을 헤더에 자동으로 삽입하는 방법을 정리해보았다. 1️⃣ 애플리케이션 Collection 설정애플리케이션 Collection의 Variables 탭에서 accessToken 변수를 등록해 준다. 애플리..
1️⃣ Spring Security FiltersSpring Security Filter들은 HTTP 요청을 처리하고 보안 관련 작업을 수행한다.만약 인증이 필요하면 사용자 로그인으로 안내하거나, 인증받은 정보가 있다면 기존의 정보를 사용한다. 일반적으로 웹 애플리케이션에서 사용자의 로그인 요청을 처리하고 인증하는 데 UsernamePasswordAuthenticationFilter가 사용된다. 이는 HTTP 요청에서 username과 password를 추출해 Authentication 타입 객체를 준비한다.Authentication은 인증된 사용자의 세부 정보를 저장하는 클래스이다.public class UsernamePasswordAuthenticationFilter extends AbstractAu..
😼 DTO(: Data Transfer Object)public class AccountResponseDto { private final Long id; private final String username; private final String nickname;}DTO는 계층간에 데이터를 전달하기 위해 사용되는 클래스이다. 따라서 DTO의 데이터는 변하면 안된다는 특징을 갖고 있다.따라서 보통의 DTO 클래스 필드는 final 속성을 갖거나 setter를 선언하지 않는다. 또한 DTO 클래스는 별도의 메서드를 포함하고 있지 않고 단순히 데이터만을 포함하고 있다. 😼 레코드(record)란?public record AccountResponseDto( Long id, Stri..
🌱 어노테이션의 기본 구조이미 선언되어 있는 어노테이션을 보면 기본적으로 @Target, @Retention이 설정되어 있는 것을 볼 수 있다.여기서 이 @Target, @Retention이 뭘까? 🌱 Meta Annotation이란?메타 어노테이션은 어노테이션을 정의할 때 사용되는 어노테이션이다.메타 어노테이션은 다른 어노테이션 위에 선언되어 그 어노테이션의 사용 방법과 동작을 지정한다. 🫧 @Retention어노테이션을 언제까지 유지할것인지 지정한다.소스 코드, 클래스 파일, 런타임 중 어느 시점까지 어노테이션 정보를 유지할지를 결정한다.1️⃣ @Retention(RetentionPolicy.SOURCE)컴파일 전까지만 유지되는 어노테이션이 필요한 경우 사용하는 옵션, 컴파일러에 의해 제거된다...
🫧 @SQLDelete JPA에서 기본적인 삭제는 Hard Delete로 되어 있다. 이 삭제 방식을 @SQLDelete를 통해 쿼리를 작성해두면, delete가 호출될 때 데이터를 실제로 삭제하지 않고 미리 정의해둔 쿼리를 실행하도록 방식 변경이 가능하다. Hard Delete 물리 삭제라고도 하며, 데이터베이스에 Delete Query를 날려 해당 데이터를 실제로 삭제한다. Soft Delete 논리 삭제라고도 하며, 데이터베이스에 Update Query를 날려 해당 데이터가 삭제된 것을 하나의 컬럼을 이용하여 구분한다. @SQLDelete는 논리 삭제를 위한 기능인 것이다. 🫧 문제 발견 테스트 코드를 작성하다가 발견하게 된 문제.. @Test @DisplayName("회원을 논리 삭제한다") vo..
이전 포스트에서 다루었던 CascadeType.REMOVE 와 orphanRemoval = true 옵션이 각각 고아객체를 어떻게 처리하는지 알아보고자 한다. 🤔 고아객체 부모 엔티티와 연관관계가 끊어진 자식 엔티티 - 부모가 제거될 때, 부모와 연관되어 있는 모든 자식 엔티티들은 고아객체가 된다. - 부모 엔티티와 자식 엔티티 사이의 연관관계를 삭제할 때, 해당 자식 엔티티는 고아객체가 된다. 공통 예제 코드 CascadeType.REMOVE 와 orphanRemoval = true 옵션이 각각 고아객체를 어떻게 처리하는지 알아보기 위하여, Review 와 ReviewImage 엔티티를 바탕으로 예제 코드를 작성해 보았다. 먼저 두 옵션에 대한 차이점을 제외하고, 공통되는 사항은 아래와 같다. Revi..