1. 보안 용어
인증(Authentication)- 클라이언트가 자신이 주장하는 사용자와 같은 사용자인지를 확인하는 과정
- 유저가 누구인지 확인하는 절차
- 예) 로그인
인가(Authorization)- 클라이언트가 하고자 하는 작업이 해당 클라이언트에게 허가된 작업인지를 확인
- 특정 자원에 대한 접근 권한이 있는지 확인하는 절차
- 유저에 대한 권한을 허락하는 것.
- '권한부여'나 '허가'와 같은 의미로 사용된다. 즉 어떤 대상이 특정 목적을 실현하도록 허용(Access)하는 것을 의미한다.
- 예) 네이버의 특정 카페는 로그인을 했다 하더라도, 어느 정도 이상의 등급이 되지 않을 경우 이용하지 못한다.
- 접근 주체(Principal)
- 보호된 대상에 접근하는 유저
- 권한
- 인증 주체가 어플리케이션의 동작을 수행할 수 있도록 허락되었는지를 결정할 때 사용한다.
3. Spring Security란?
- Spring 기반의 어플리케이션의 보안(인증/권한)을 담당하는 프레임워크를 말한다.
- Spring Security를 사용하면 편리하게 인증/인가를 구현할 수 있다.
- 만약 Spring Security를 사용하지 않는다면, 자체적으로 세션을 체크하고 리다이렉트 해야한다.
- Spring Security는 보안과 관련해서 체계적으로 많은 옵션들을 지원한다.
- Spring Security는
필터(Filter)를 기반으로 동작하기 때문에 Spring MVC와 분리되어 관리 및 동작한다. - Spring Security 3.2부터는 XML로 설정하지 않고 자바 Config 설정으로 간단하게 설정할 수 있도록 지원하고 있다.
4. 스프링 시큐리티 필터(Spring Sercurity Filter)
- 클라이언트(보통 브라우저)는 요청을 보내게 되고, 그 요청을 서블릿이나 JSP등이 처리하게 된다.
- 스프링 MVC에서는
DispatcherServlet이 요청을 가장 먼저 받고, DispatcherServlet이 요청을 받기 전에 여러필터들이 있을 수 있다. - 이 필터의 역할은 클라이언트와 자원 사이에서 요청과 응답 정보를 이용해 다양한 처리를 하는데 목적이 있다.
- 어떤 필터는 요청을 받은 후, 클라이언트가 원래 요청한 자원이 아닌 다른 자원으로 리다이렉트 시킬 수도 있고, 어떤 필터는 다음 필터에게 요청과 응답을 전달하지 않고, 바로 클라이언트에게 응답하고 끝낼 수 있다.
- 스프링 시큐리티는 다양한 기능을 가진 필터 10개 이상을 기본적으로 제공한다. 이렇게 제공되는 필터들을 Security Filter Chain(시큐리티 필터 체인)이라고 한다.
위의 그림은 시큐리티 필터 체인과 각각의 필터에서 사용하는 객체들(Repository, Handler, Manager 등)에 대해 잘 표현하고 있다.
5. 스프링 시큐리티가 제공하는 필터의 역할
- SecurityContextPersistenceFilter : SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다.
- LogoutFilter : 설정된 로그아웃 URL로 오는 요청을 감시하며, 해당 유저를 로그아웃 처리.
- (UsernamePassword)AuthentocationFilter : (아이디와 비밀번호를 사용하는 form 기반 인증) 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증을 처리.
- 1. AuthenticationManager를 통한 인증 실행.
- 2. 인증 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후, AuthenticationSuccessHandler 실행.
- 3. 인증 실패 시, AuthenticationFailureHandler 실행.
- DefaultLoginPageGeneratingFilter : 인증을 위한 로그인 폼 URL을 감시.
- BasicAuthentocationFilter : HTTP 기본 인증 헤더를 감시하여 처리.
- RequestCacheAwareFilter : 로그인 성공 후 , 원래 요청 정보를 재구성하기 위해 사용.
- SecurityContextHolderAwareRequestFilter : HttpServletRequestWrapper를 상속한 SecurityContextHolderAwareRequestWrapper 클래스로 HttpServletRequest 정보를 감싼다. SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가 정보를 제공한다.
- AnonymousAuthenticationFilter : 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면, 인증 토큰에 사용자가 익명 사용자로 나타난다.
- SessionManagementFilter : 이 필터는 인증된 사용자와 관려된 모든 세션을 추적한다.
- ExceptionTranslationFilter : 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
- FilterSecurityINterceptor : 이 필터는 AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해준다.
6. 스프링 시큐리티 인증 관련 아키텍처
- 아이디와 암호를 입력했을 때 이를 처리하는 필터는 AuthenticationFilter이다.
- 해당 필터는 다음 그림과 같은 순서로 동작한다.
1. 클라이언트(유저)가 로그인을 시도한다.
2. AuthentocationFilter는 AuthenticationManager, AuthenticationProvider(s), UserDetailService를 통해 DB에서 사용자 정보를 읽어온다. 여기서 중요한 것은 UserDetailService가 인터페이스라는 것이다. 해당 인터페이스를 구현한 빈(Bean)을 생성하면 스프링 시큐리티는 해당 빈을 사용하게 된다. 즉 어떤 데이터베이스로 읽어들일지 스프링 시큐리티를 이용하는 개발자가 결정할 수 있게 된다.
3. UserDetailService는 로그인한 ID에 해당 하는 정보를 DB에서 읽어들여 UserDetails를 구현한 객체로 반환한다. 프로그래머는 UserDetails를 구현한 객체를 만들어야 할 필요가 있을 수 있다. UserDetails 정보를 세션에 저장하게 된다.
4. 스프링 시큐리티는 인메모리 세션 저장소인 SecurityContextHolder에 UserDetail 정보를 저장하게 된다.
5. 클라이언트(유저)에게 session ID(JSESSION ID)와 함께 응답을 한다.
6. 이후 요청에서는 요청 쿠키에서 JSESSION ID 정보를 통해 이미 로그인 정보가 저장되어 있는지 확인한다. 이미 저장되어 있고 유효하면 인증 처리를 해준다.
참조 URL
'Java > Spring' 카테고리의 다른 글
SLF4J란? (0) | 2020.07.20 |
---|---|
로깅(Logging)이란? (0) | 2020.07.20 |
아큐먼트 리졸버란? (1) | 2020.07.17 |
인터셉터(Interceptor)란? (0) | 2020.07.17 |
Spring MVC에서 Session 사용하기 (0) | 2020.07.17 |