[Spring] 스프링 시큐리티란?

이 글은 [스프링 부트 3 백엔드 개발자 되기(자바 편)(2판)]에서 발췌했습니다.
골든래빗 출판사

스프링 기반의 애플리케이션의 보안(인증, 인가)을 담당하는 스프링 하위 프레임워크인 스프링 시큐리티가 무엇인지 정리했습니다.

 

[Spring] 스프링 시큐리티란?

스프링 시큐리티(Spring Security)는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크입니다. 스프링 시큐리티를 이해하려면 인증과 인가에 대한 개념을 알아야 합니다. 그럼 시작해볼까요?

 

인증과 인가

인증(Authentication)은 사용자의 신원을 입증하는 과정입니다. 예를 들어 사용자가 사이트에 로그인을 할 때 누구인지 확인하는 과정을 인증이라고 합니다.

인가(Authorization)는 인증과는 다릅니다. 인가는 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업입니다.

예를 들어 관리자는 관리자 페이지에 들어갈 수 있지만 일반 사용자는 관리자 페이지에 들어갈 수 없습니다. 이런 권한을 확인하는 과정을 인가라고 합니다. 인증과 인가 관련 코드를 아무런 도구의 도움 없이 작성하려면 굉장히 많은 시간이 필요한데요, 스프링 시큐리티를 사용하면 아주 쉽게 처리할 수 있습니다.

 

스프링 시큐리티

스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크입니다. 보안 관련 옵션을 많이 제공하죠. 그리고 애너테이션으로 설정도 매우 쉽습니다. CSRF 공격, 세션 고정(Session Fixation) 공격을 방어해주고, 요청 헤더도 보안 처리를 해주므로 개발자가 보안 관련 개발을 해야 하는 부담을 크게 줄여줍니다.

 

※ CSRF 공격은 사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공격을 말합니다.

※ 세션 고정 공격은 사용자의 인증 정보를 탈취하거나 변조하는 공격을 말합니다.

 

필터 기반으로 동작하는 스프링 시큐리티

스프링 시큐리티는 필터 기반으로 동작합니다. 스프링 시큐리티의 필터 구조를 살펴보며 어떤 필터가 동작하는지 알아보겠습니다.

 

※ 스프링 시큐리티의 필터 구조가 굉장히 복잡해보여 처음에는 부담스러울 수 있지만 이 구조는 결국 스프링 시큐리티를 사용하려면 알아야 하는 내용입니다. 그냥 넘어가지 말고 꼭 공부하고 넘어가세요!

 

 

스프링 시큐리티는 이렇게 다양한 필터들로 나누어져 있으며, 각 필터에서 인증, 인가와 관련된 작업을 처리합니다.

SecurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecurityInterceptor까지 순서대로 필터를 거칩니다. 필터를 실행할 때는 회색 화살표로 연결된 오른쪽 박스의 클래스를 거치며 실행합니다. 특정 필터를 제거하거나 필터 뒤에 커스텀 필터를 넣는 등의 설정도 가능합니다. 여기서 눈여겨볼 필터는 회색으로 색칠한 UsernamePasswordAuthenticationFilter와 FilterSecurityInterceptor입니다. ❶ UsernamePasswordAuthenticationFilter는 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할을 합니다. ❷ FilterSecurityInterceptor는 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 합니다.

 

 

가장 많이 사용하는 아이디와 패스워드 기반 폼 로그인을 시도하면 스프링 시큐리티에서는 어떤 절차로 인증 처리를 하는지 그림을 보면서 알아보겠습니다.

 

 

❶ 사용자가 폼에 아이디와 패스워드를 입력하면, HTTPServletRequest에 아이디와 비밀번호 정보가 전달됩니다. 이때 AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 합니다. ❷ 유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨줍니다. ❸ 전달받은 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보냅니다. ❹ UsernamePasswordAuthenticationToken을 AuthenticationProvider에 보냅니다.

 

❺ 사용자 아이디를 UserDetailService에 보냅니다. UserDetailService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달합니다. ❻ DB에 있는 사용자 정보를 가져옵니다. ❼ 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 합니다. ❽ ~ ❿ 까지 인증이 완료되면 SecurityContextHolder에 Authentication을 저장합니다. 인증 성공 여부에 따라 성공하면 AuthenticationSuccessHandler, 실패하면 AuthenticationFailureHandler 핸들러를 실행합니다.

 

여기까지 스프링 시큐리티 폼 로그인의 인증 흐름을 알아보았습니다. 스프링 시큐리티의 폼 로그인을 설정하는 것은 간단하지만 실제로는 이러한 복잡한 내부 동작을 실행합니다. 물론 이 동작을 모두 다 외워야 하는 것은 아니지만 어떠한 흐름으로 로그인이 동작하는지 이해하면 스프링 시큐리티를 더 잘 이해하고 활용할 수 있습니다.

 

핵심 요약

  1. 인증은 보호된 리소스에 접근하는 것을 허용하기 이전에 등록된 사용자의 신원을 입증하는 과정입니다.
  2. 인가는 특정 부분에 접근할 수 있는지에 확인하는 작업입니다.
  3. 스프링 시큐리티(Spring Security)는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크입니다. 스프링 시큐리티는 필터 기반으로 동작합니다. 각 필터에서 인증, 인가와 관련된 작업을 처리합니다. 기본적으로 세션 & 쿠키 방식으로 인증을 처리합니다.
    • 스프링 시큐리티에서 사용자의 인증, 인가 정보를 UserDetails 객체에 담습니다. 이 클래스를 상속받은 뒤 메서드를 오버라이드해 사용하면 됩니다.
    • 스프링 시큐리티에서 사용자의 정보를 가져오는 데 사용하는 UserDetailService를 사용합니다. 이 클래스를 상속받은 뒤 loadUserByUsername( )을 오버라이드하면 스프링 시큐리티에서 사용자의 정보를 가져올 때 오버라이드된 메서드를 사용합니다.

신선영

리멤버 백엔드 개발자. 하드 스킬과 소프트 스킬 역량을 강화하고자 부단히 공부하고 글로 남기는 백엔드 개발자입니다. 평일 기준 하루 평균 600뷰의 기술 블로그를 운영하고, 모교 학생을 대상으로 정기 세미나와 멘토링을 진행합니다. 구독자가 1,000명 정도 되는 사이드 프로젝트를 기획하고 개발하고 운영한 경험이 있습니다.

저자 블로그 shinsunyoung.tistory.com
저자 깃허브 github.com/shinsunyoung

 

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내