스프링으로 블로그를 만들어보는데 드디어 시큐리티를 사용했다!
OAuth까지 3번 이상 만들어 본다음 블로그를 만드는 과정은 정리해서 올릴 예정이다
그래서 지금은 시큐리티를 더 잘 이해할 수 있게 어떻게 동작하는지 적어보려고 한다!!
spring Security에서 핵심은 "인증"과 "인가"로 볼 수 있다
인증(Authenticate) => 이 사용자가 사이트에 들어올 수 있는 사용자인지
인가(Authorize) => 어디까지 사용자가 권한을 가지고 있는지를 판단
스프링 시큐리티를 사용하면 개발자가 일일이 보안 관련 로직을 작성하지 않아도 됨!
Filter 기반으로 동작해서 Spring MVC와 별개로 동작해서 영향을 주지 않는다
어노테이션으로 간단한 설정이 가능함!
기본적으로 세션 & 쿠키 방식으로 인증한다!
시큐리티 흐름도를 찾으면 가장 대표적으로 나오는 아키텍처 그림이다!!
처음에는 유저가 HttpRequest로 url로 들어가길 요청한다
스프링 시큐리티는 필터로 동작해서 인증과 인가를 위한 필터를 제공한다!
ex) loginForm에 의한 인증 요청은 UserPasswordAuthenticationFilter를 통과!
Http 기본 인증을 요청하면 BasicAuthenticationFilter를 통과한다
유저 자격을 기반으로 인증 토큰을 만든다
username과 password를 요청으로 추출하여 인증객체를 생성!
그래서 UsernamePasswordAuthentication Token을 생성함!!
Filter를 통해 Authentication Token을 Authentication Manager에게 위임한다
UsernamePasswordAuthentication Token을 생성후
AuthenticationManager의 인증 메소드를 호출한다!!
(인터페이스여서 구현은 ProductManager로 되어있음!!)
AuthenticationManager에 등록된 AuthenticationProvider를 조회하여 인증을 요구
실제 DB에서 사용자 인증 정보를 가져오는 UserDetailsService에 사용자 정보를 넘겨줌
이제 DB에서 찾은 사용자 정보인 UserDetails 객체를 만든다
AuthenticationProvider는 UserDetails객체를 넘겨받고 사용자 정보를 비교!
인증이 완료되면 권한 등의 사용자의 정보를 담은 Authentication 객체를 반환!
다시 최초의 AuthenticationFilter에 Authentication 객체가 반환됨!
Authentication 객체를 SecurityContext에 저장함!
최종적으로 SecurityContextHolder는 세션영역에 있는 SecurityContext에
Authentication객체를 저장!
사용자의 정보를 저장한다는 것은 세션-쿠키 인증 방식을 사용하겠다는 것!