스프링

    [Spring Security] 스프리 시큐리티를 이용한 회원가입, 로그인 구현

    [Spring Security] 스프리 시큐리티를 이용한 회원가입, 로그인 구현

    시큐리티 설정 파일을 만든다. @Configuration @EnableWebSecurity // 모든 요청 URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션. // 내부적으로 SpringSecurityFilterChain이 동작하여 URL 필터가 적용된다. @RequiredArgsConstructor // Adapter를 상속함으로써 httpSecurity의 다양한 속성을 설정. public class WebSecurityConfig extends WebSecurityConfigurerAdapter { // defines which URL paths should be secured and not. @Override protected void configure(HttpSecurity http) t..

    [Spring Security] 기본 로그인 인증 로직

    [Spring Security] 기본 로그인 인증 로직

    이번에는 스프링 시큐리티에서 기본 HTTP 인증 로직이 어떻게 돌아가는지 알아보자. Basic HTTP Authentication 클라이언트로 요청이 들어오면 SecurityFilterChain에서 다음과 같은 동작이 일어난다. 1. 클라이언트가 인증되지 않은 요청을 한다. 2. 스프링 시큐리티의 FilterSecurityInterceptor는 AccessDeniedException 예외를 던지면서 요청을 거절한다. 3. 유저가 인증되지 않았기 때문에 ExceptionTranslationFilter는 인증에 필요한 과정을 실행한다. - AuthenticationEntryPoint의 구현체인 Basic AuthenticationEntryPoint는 WWW-Authenticate header를 보낸다. - ..

    [Spring Security] 스프링 시큐리티와 구조, 동작 원리

    [Spring Security] 스프링 시큐리티와 구조, 동작 원리

    Spring Security란? 입증, 권한, 그리고 흔한 공격에 대한 방어적 기술을 제공하는 프레임워크이다. 1. 입증이란 특정 리소스에 접근하는 사용자의 신원을 어떻게 증명할 것인지에 대한 부분이다. 가장 흔한 입증 방식은 유저에게 이메일과 패스워드를 입력하게 하는 방식이다. 2. 이런 입증과정을 통해 입증이 되면, 사용자는 권한을 행사할 수 있게 된다. (특정 리소스에 접근할 수 있음) Spring Security와 Servlet Applications 스프링 시큐리티는 Servlet의 Filter를 사용함으로써 Servlet 컨테이너를 지원한다. 따라서 Servlet을 사용하는 모든 어플리케이션에서 스프링 시큐리티를 사용할 수 있다. Architecture Servlet을 기반으로 한 어플리케이션..

    [Spring] BindingResult를 이용한 검증

    [도입] 컨트롤러의 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것이다. 이 때 검증은 클라이언트와 서버단에서 모두 이루어 지는게 좋다. 그 이유는 다음과 같다. 클라이언트 검증은 조작할 수 있으므로 보완에 취약하다. -> 데이터를 조작해서 서버로 보낼 수 있다. 서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다. 따라서 둘을 적절히 섞어서 사용하되, 최종적으로 서버 검증은 필수적이다. Spring에서는 서버단에서 검증을 할 때 에러를 확인하고 이를 view로 쉽게 전달하기 위해서 BindingResult객체를 제공한다. [BindingResult] 보통 errors 메세지를 담고 활용하기 위해 HashMap을 이용하는데, 스프링은 이를 더 쉽게 처리하기 위해 BindingResult객체를 제..

    [Spring] 요청 파라미터

    HttpServeltRequest의 request.getParameter()를 사용하면 두 가지 요청 파라미터를 조회할 수 있다. GET 쿼리 파라미터, POST HTML Form 전송 방식이든 둘다 형식이 같으므로 구분없이 조회할 수 있다. RequestParam @ResponseBody @RequestMapping("/request-param") public String requestParam( @RequestParam("username") String memberName, @RequestParam("age") int memberAge return "ok"; } 1. RequestParam의 이름와 변수명이 같으면 생략할 수 있다. @ResponseBody @RequestMapping("/reques..