스프링 시큐리티(Spring Security)

·2023년 12월 3일
0

Spring Boot

목록 보기
13/21
post-thumbnail

📚 들어가며

스프링 시큐리티는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크다. 오늘 포스팅에서는 이 내용을 다뤄 보려고 한다.


✨ 3A

3A란 인증(Authentication), 인가(Authorization), 계정 관리(Accounting)을 통합한 보안 소프트웨어이다.

Authentication

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

Authorization

인가(Authorization)는 인증과는 다르다. 인가는 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업이다. 예를 들어 관리자는 관리자 페이지에 들어갈 수 있지만 일반 사용자는 관리자 페이지에 들어갈 수 없다. 이런 권한을 확인하는 과정을 인가라고 한다.

Accounting

계정 관리(Accounting)은 위에서 인증 받은 사용자가 무슨 동작을 하는지 기록하는 것이다.

인증과 인가 관련 코드는 아무런 도구의 도움 없이 작성하려면 많은 시간이 필요하다. 그러나 스프링 시큐리티를 사용하면 아주 쉽게 처리가 가능하다! 👏


🍀 스프링 시큐리티란?

스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크로, 보안 관련 옵션을 많이 제공하고 있다. 또한 어노테이션 설정도 매우 간단하다. CSRF 공격, 세션 고정 공격을 방어해 주고, 요청 헤더도 보안 처리를 해 줌으로 개발자가 보안 관련 개발을 해야 하는 부담을 크게 줄여 준다.

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

스프링 시큐리티는 필터 기반으로 동작한다. 필터는 매우 다양하게 구성되어 있으며 아래의 그림으로 살펴보자.

(굉장히.. 복잡.. 😅)

아무튼 SecurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecurityInterceptor까지 순서대로 필터를 거친다. 필터를 실행할 때는 빨간색 화살표로 연결된 오른쪽 박스의 클래스를 거치며 실행한다.

그중 UsernamePasswordAuthenticationFilter는 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할을 해 준다. 또한 FilterSecurityInterceptor는 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 한다.

만약 아이디, 패스워드 기반 폼 로그인을 시도한다면?

이때 스프링 시큐리티에서는 어떤 절차로 인증 처리를 할까? 그림으로 살펴보자.

  1. 사용자가 폼에 아이디, 비밀번호를 입력하면 HTTPServletRequest에 아이디, 비밀번호 정보가 전달된다. 이때 AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 한다.
  2. 유효성 검사가 끝나면 UsernamePasswordAuthenticationToken을 만들어 넘겨 준다.
  3. 전달받은 인증용 객체인 UsernamePasswordAuthenticationTokenAuthenticationManager에게 보낸다.
  4. UsernamePasswordAuthenticationTokenAuthenticationProvider에 보낸다.
  5. 사용자 아이디를 UserDetailService에 보낸다. UserDetailService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다.
  6. DB에 있는 사용자 정보를 가져온다.
  7. 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 한다.
  8. 8~10번까지 인증이 완료되면 SecurityContextHolderAuthentication을 저장한다. 인증 성공 여부에 따라 해당하는 핸들러를 실행한다.

🤔 끝마치며

이번 포스팅에서는 스프링 시큐리티에 대해 알아보았다. 과정이 꽤나 복잡해 보이지만 이 구조에 익숙해지면 스프링 시큐리티로 기능을 구현하는 데 훨씬 수월할 것 같다. 다음 포스팅에서는 이를 활용해 블로그의 로그인/로그아웃, 회원 가입을 구현해 보자! 😆

profile
풀스택 개발자 기록집 📁

0개의 댓글