Java 52

CORS 설정

CORS(Cross Origin Resource Sharing) CORS란 서로 다른 출처의 요청이더라도 서버의 리소스를 사용할 수 있도록 해주는 설정이다. 항상 SecurityFilterChain에 csrf().disable() 만을 사용하다가 팀 프로젝트를 앞두고 좀더 보안이 강화된 CORS 설정이 필요할 것 같아 알아보게 되었다. 찾아낸 방법으로는 3가지가 있었다. Spring MVC의 Controller에 직접 CORS 설정 Spring MVC에서 WebMvcConfigurer를 구현하는 설정 bean 등록 Spring Security에서 설정 bean 등록 방법 1. Spring MVC의 Controller에 직접 CORS 설정 제일 직관적인 방법이다. @RestController @CrossO..

JWT

JWT를 알아보기 전에 Token기반과 Session기반 인증의 차이에 대해 알아보자. 세션 기반 자격 증명 방식 세션 기반 자격 증명 방식은 서버 측에 인증된 사용자의 정보를 세션 형태로 세션 저장소(DB)에 저장하는 방식이다. 즉, 클라이언트 측에서 서버 측으로 요청이 들어오면 서버 측에서는 사용자를 식별하기 위해 세션 저장소에 저장된 세션 정보와 사용자가 제공하는 세션이 일치하는지 확인하는 인증 작업을 거친 뒤 인가 처리를 진행한다. 세션 기반 자격 증명의 특징 세션은 인증된 사용자 정보를 서버 측 세션 저장소(DB)에서 관리한다. 생성된 사용자 세션의 고유 ID인 세션 ID는 클라이언트의 쿠키에 저장되어 request 전송 시, 인증된 사용자인지를 증명하는 수단으로 사용된다. 세션 ID만 클라이언..

DelegatingPasswordEncoder

DelegatingPasswordEncoder DelegatingPasswordEncoder는 Spring Security에서 지원하는 PasswordEncoder 구현 객체를 생성해 주는 컴포넌트로써 DelegatingPasswordEncoder를 통해 애플리케이션에서 사용할 PasswordEncoder를 결정하고, 결정된 PasswordEncoder로 사용자가 입력한 패스워드를 단방향으로 암호화해준다. // PasswordEncoder 객체 생성 PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); // PasswordEncoder 사용 passwordEncoder.matches((Str..

SecurityFilterChain과 AuthenticationProvider 구현

SecurityFilterChain HttpSecurity 인스턴스를 매개변수로 받아 SecurityFilterChain으로 만들어준다. 이전 포스트, Spring Security Filter의 동작 흐름에 기재된 것과 같이 SecurityFilterChain은 DelegatingFilterProxy와 FilterChainProxy를 통해 Servlet filter와 연결된다. @Configuration public class SecurityConfiguration { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http .headers().frameOptions().sameOrigin() // (1) ..

Spring Security의 인증 처리 흐름

이전 포스트에서 클라이언트의 요청이 Spring Security Filter까지 도달하는 과정을 포스트 했었다. 이번 포스트에서는 도달한 사용자의 인증 요청이 Spring Security Filter Chain의 특정 Filter에 도달했을 때, Spring Security의 컴포넌트들이 어떤 과정을 거쳐 사용자의 인증 요청을 처리하는지 그 흐름에 대해 포스트 할 예정이다. Spring Security의 인증(Authentication) 처리 흐름 위의 그림은 개발자가 지정한 특정한 URL(로그인)으로 포스트요청이 들어왔을때의 처리 흐름이다. 먼저 (1)에서 사용자가 로그인 폼 등을 이용해 Username(로그인 ID)과 Password를 포함한 request를 Spring Security가 적용된 애플..

Spring Security Filter의 동작 흐름

Spring Security Filter를 알기 전에 웹요청의 처리 흐름에 대해 먼저 알아야 한다. Servlet의 FilterChain 서블릿기반 어플리케이션의 경우, 클라이언트에서 웹요청이 들어오면 서블릿 컨테이너는 해당 요청을 DispetcherServlet으로 보내기 이전에 FilterChain을 생성한뒤 HttpServletRequest를 진행한다. 이때 FilterChain을 구성하는 요소들이 Filter이다. 이때 하나의 서블릿은 하나의 HttpServletRequest와 HttpServletResponse를 제어하며 이를 위해 여러 Filter들이 사용될 수 있다. DelegatingFilterProxy Servlet filter가 Servlet container 안에 존재하는 것과 달리 ..

Spring Rest Docs Custom

다이전 포스트에서 Spring Rest Docs를 이용하여 API문서의 자동화를 진행하던 중 몇가지 보완해야될 점을 발견했다. 테이블에 optional에 대한 정보 표현 유효성 검증에 대한 정보 표현 두가지를 표현하기 위해서 Spring Rest Docs 사용자 정의를 이용하여 API문서를 좀 더 개발자에 맞게 표현해줄 수 있다. Optional에 대한 정보 표현 1. Request fields의 Optional에 대한 정보 표시 @WebMvcTest(MemberController.class) @MockBean(JpaMetamodelMappingContext.class) @AutoConfigureRestDocs public class MemberControllerRestDocsTest { ... ... ..

Spring Rest Docs (API 문서화)

API 문서화란 클라이언트가 REST API 백엔드 애플리케이션에 요청을 전송하기 위해서 알아야 되는 요청 정보(요청 URL(또는 URI), request body, query parameter 등)를 문서로 잘 정리하는 것을 의미한다. API 자동 문서화의 방법으로 Swagger와 Spring Rest Docs를 사용한다. 둘의 특징은 다음과 같으며 이번 포스트에서는 Spring Rest Docs를 사용한다. Swagger의 API 문서화 방식 애터네이션 기반의 API 문서화 방식 애플리케이션 코드에 문서화를 위한 애너테이션들이 포함된다. 가독성 및 유지 보수성이 떨어진다. API 문서와 API 코드 간의 정보 불일치 문제가 발생할 수 있다. API 툴로써의 기능을 활용할 수 있다. Spring Res..

Slice test

메서드 단위로 테스트하는 단위 테스트와 는 달리 Slice 테스트는 계층별로 테스트를 진행한다. (ex. Api 계층, 서비스 계층, 데이터베이스 계층) API 계층 테스트 Api계층의 Controller 테스트를 위한 테스트 클래스 구성 import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springfra..