스프링 시큐리티는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크다. 오늘 포스팅에서는 이 내용을 다뤄 보려고 한다.
3A란 인증(Authentication), 인가(Authorization), 계정 관리(Accounting)
을 통합한 보안 소프트웨어이다.
인증(Authentication)은 사용자의 신원을 입증하는 과정이다. 예를 들어 사용자가 사이트에 로그인을 할 때 누구인지 확인하는 과정이 인증이다.
인가(Authorization)는 인증과는 다르다. 인가는 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업이다. 예를 들어 관리자는 관리자 페이지에 들어갈 수 있지만 일반 사용자는 관리자 페이지에 들어갈 수 없다. 이런 권한을 확인하는 과정을 인가라고 한다.
계정 관리(Accounting)은 위에서 인증 받은 사용자가 무슨 동작을 하는지 기록하는 것이다.
인증과 인가 관련 코드는 아무런 도구의 도움 없이 작성하려면 많은 시간이 필요하다. 그러나 스프링 시큐리티를 사용하면 아주 쉽게 처리가 가능하다! 👏
스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크로, 보안 관련 옵션을 많이 제공하고 있다. 또한 어노테이션 설정도 매우 간단하다. CSRF 공격, 세션 고정 공격을 방어해 주고, 요청 헤더도 보안 처리를 해 줌으로 개발자가 보안 관련 개발을 해야 하는 부담을 크게 줄여 준다.
스프링 시큐리티는 필터 기반으로 동작한다. 필터는 매우 다양하게 구성되어 있으며 아래의 그림으로 살펴보자.
(굉장히.. 복잡.. 😅)
아무튼 SecurityContextPersistenceFilter
부터 시작해서 아래로 내려가며 FilterSecurityInterceptor
까지 순서대로 필터를 거친다. 필터를 실행할 때는 빨간색 화살표로 연결된 오른쪽 박스의 클래스를 거치며 실행한다.
그중 UsernamePasswordAuthenticationFilter
는 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할을 해 준다. 또한 FilterSecurityInterceptor
는 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 한다.
이때 스프링 시큐리티에서는 어떤 절차로 인증 처리를 할까? 그림으로 살펴보자.
- 사용자가 폼에 아이디, 비밀번호를 입력하면
HTTPServletRequest
에 아이디, 비밀번호 정보가 전달된다. 이때AuthenticationFilter
가 넘어온 아이디와 비밀번호의 유효성 검사를 한다.- 유효성 검사가 끝나면
UsernamePasswordAuthenticationToken
을 만들어 넘겨 준다.- 전달받은 인증용 객체인
UsernamePasswordAuthenticationToken
을AuthenticationManager
에게 보낸다.UsernamePasswordAuthenticationToken
을AuthenticationProvider
에 보낸다.- 사용자 아이디를
UserDetailService
에 보낸다.UserDetailService
는 사용자 아이디로 찾은 사용자의 정보를UserDetails
객체로 만들어AuthenticationProvider
에게 전달한다.- DB에 있는 사용자 정보를 가져온다.
- 입력 정보와
UserDetails
의 정보를 비교해 실제 인증 처리를 한다.- 8~10번까지 인증이 완료되면
SecurityContextHolder
에Authentication
을 저장한다. 인증 성공 여부에 따라 해당하는 핸들러를 실행한다.
이번 포스팅에서는 스프링 시큐리티에 대해 알아보았다. 과정이 꽤나 복잡해 보이지만 이 구조에 익숙해지면 스프링 시큐리티로 기능을 구현하는 데 훨씬 수월할 것 같다. 다음 포스팅에서는 이를 활용해 블로그의 로그인/로그아웃, 회원 가입을 구현해 보자! 😆