상세 컨텐츠

본문 제목

[SPRING SECURITY] 스프링 시큐리티란

JAVA/SPRING

by ranlan 2021. 3. 14. 20:58

본문

728x90

Spring Security(스프링 시큐리티) 

보안 솔루션을 제공하는 스프링 기반의 하위 프레임워크로 스프링MVC와 분리되어 별도의 filter 기반으로 동작한다.

세션-쿠키 이용한 서버기반의 인증방식이다. https://juran-devblog.tistory.com/4

 

[WEB] 서버기반 인증 vs 토큰기반 인증

Stateless 서버와 클라이언트 간의 상태를 유지하지 않음 (서버가 클라이언트의 정보를 유지하지 않음) 클라이언트의 상태를 서버나 세션에 유지하지 않고 클라이언트로부터 새로 도착한 요청에

juran-devblog.tistory.com

스프링 시큐리티 주요 키워드

  • 인증(Authentication)
    보호된 리소스에 접근한 대상이 누군인지 확인하는 것으로 해당 사용자가 본인이 맞는 지 확인한다.
  • 인가(Authorization)
    인증 이후 발생하며 사용자가 특정 자원에 대한 접근 권한이 있는지 확인하고 그 권한을 부여한다.
  • Principal
    접근 주체, 보호 받는 자원에 접근하는 대상 ex) 이름, 아이디
  • Credintail
    자원에 접근하는 대상의 비밀번호

 

 

동작방식

스프링 시큐리티는 일련의 필터들을 갖고 있다. 요청과 인증, 권한 부여는 이 필터들을 통과하며 수행된다.

스프링 시큐리티 구조

  1. 사용자가 HTTP Request로 로그인 시도
  2. AuthenticationFilter가 HttpServletRequest에서 사용자가 보낸 아이디와 패스워드를 바탕으로
    인증용 객체(UsernamePasswordAuthenticationToken) 생성
  3. AuthenticationFilterAuthenticationManager에게 UsernamePasswordAuthenticationToken(인증용 객체) 위임
  4. 실제 인증을 처리할 AuthenticationProvider(AuthenticationManager 구현체)에게
    인증용 객체(UsernamePasswordAuthenticationToken) 다시 전달
  5. UserDetailService의 메서드를 이용하여 AuthenticationProvider의 인증 절차 실행할 것을 요청
  6. UserDetailServices 인터페이스는 화면에서 입력한 사용자의 이름과
    오버라이딩된 loadUserByUsername() 메소드를 호출하여 DB에 있는 사용자 정보 조회
  7. UserDetails를 구현한 사용자 정보(User)객체에서 해당 사용자의 정보를 꺼내옴
  8. 사용자가 존재하지 않을 시 예외 반환, 존재할 시 Authentication 참조 리턴
  9. 사용자 정보가 담긴 Authentication 객체 다시 AuthenticationFilter로 전달
  10. 인증이 완료된 Authentication 객체를 SecurityContextHolder에 담은 이후 AuthenticationSuccessHandle를 실행
    실패 시 AuthenticationFailureHandler 실행

 

 

필터 동작 과정

로그인 요청이 오면 먼저 ApplicationFilter 객체로 이동

→ ApplicationFilter들을 거쳐 DelegatingFilterProxyRegistrationBean 필터를 만남

더보기

 

DelegatingFilterProxyRegistrationBean

DelegatingFilterProxy라는 클래스로 만들어진 스프링 빈으로 등록시켜주는 역할

스프링 부트에서는 @EnableAutoConfiguration 어노테이션을 이용하여
SecurityFilterAutoConfiguration클래스를 로드하고 SpringSecurityFilterChain 빈으로 등록해줌

 

→ 이 때 스프링 시큐리티가 만든 DelegatingFilterProxy(SpringSecurityFilterChain)이 필터로 동작

더보기

 

SpringSecurityFilterChain

DelegatingFilterProxy가 처리를 위임하는 필터 클래스는 FilterChainProxy로 내부에 체인으로 등록된 필터 순서대로 수행

 

→ SpringSecurityFilterChain은 스프링에서 보안관 관련된 필터 리스트를 갖고 있는 객체로 필터 리스트를 순회하며 필터링 실시

 

이 필터 리스트가 바로 AuthenticationFilter

WebAsyncManagerIntegrationFilter SpringSecurityContextHolder는 ThreadLocal기반으로 동작
(하나의 쓰레드에서 SecurityContext 공유하는 방식)

비동기(Async)와 관련된 기능을 쓸 때에도
SecurityContext를 사용할 수 있도록 만들어주는 필터
* SecurityContext: Authentication 객체를 보관하는 보관 인터페이스
SecurityContextPersistenceFilter SecurityContextRepository에서 SecurityContext를 로드하고 저장
HeaderWriterFilter 응답에 Security와 관련된 헤더 값을 설정해주는 필터
CsrfFilter csrf 공격을 방어하는 필터
LogoutFilter 로그아웃을 요청하는 필터
DefaultLogoutPageGeneratingFilter가 로그아웃 기본 페이지를 생성
UsernamePasswordAuthenticationFilter AuthenticationManager를 통한 인증 실행
성공하면 Authentication객체 SecurityContext에 저장 후AuthenticationSuccessHandler 실행
실패하면 AuthenticationFailureHandler 실행
RequestCacheAwareFilter 로그인 성공 이후 인증 요청에 의해 가로채진 사용자의 원래 요청 정보로 재구성하는 필터 
AnonymousAuthenticationFilter 이 필터에 올 때까지 앞에서 사용자 정보가 인증되지 않았다면
익명의 사용자가 보낸 것으로 판단하여 처리
(Authentication 객체를 새로 생성함(AnonymousAuthenticationToken))
SessionManagementFilter 세션 변조 공격 방지 (SessionId를 계속 다르게 변경하여 클라이언트에 전달)
유효하지 않은 세션으로 접근했을 때 URL 핸들링
 하나의 세션 아이디로 접속하는 최대 세션 수(동시 접속) 설정
세션 생성 전략 설정
ExceptionTranslationFilter 앞선 필터 처리 과정에서 인증 예외(AuthenticationException) 또는
인가 예외(AccessDeniedException)가 발생한 경우 등 예외 처리(모든 예외를 처리하는 것은 아님)
FilterSecurityInterceptor 권한 부여와 관련된 결정을 AccessDecisionManager에게 위임해
접근 권한이 있는지 확인하고 처리하는 필터

 

CSRF 공격과 Session Fixation 공격에 대한 방어 https://juran-devblog.tistory.com/32

 

[SPRING SECURITY] CSRF

CSRF(Cross Site Request Forgery) 공격 사용자 의지와 무관하게 공격자의 의도대로 서버에 특정 요청을 하도록 함 예를 들어 한 사용자가 서비스를 사용중이다. 공격자는 이와 비슷한 도메인을 가진 가

juran-devblog.tistory.com

  • 모든 URL에 대한 인증 요구
  • 요청 헤더 보안
  • 서블릿 API 메소드와 통합
  • 인증 성공 후 인가처리
  • Credential 기반 인증 방식

 

728x90

'JAVA > SPRING' 카테고리의 다른 글

[WEB] RESTful API 만들기  (0) 2021.03.22
[JPA] 게시판 CRUD  (0) 2021.03.21
[SPRING SECURITY] 스프링 부트 환경설정  (0) 2021.03.14
[SPRING BOOT] 디렉터리 구조  (0) 2021.03.13
[SPRING BOOT] 환경설정  (0) 2021.03.13

관련글 더보기

댓글 영역