[Spring] Spring Security에 대해서
현재 개인 프로젝트를 진행 중이다. 아직 로그인 기능을 제대로 구현해본 적이 없어서 스프링 시큐리티와 JWT를 통해 카카오 로그인을 구현해보았다. 그 과정에서 자세히 알아본 스프링 시큐리티에 대해서 설명해보겠다!
1. Spring Security 개념

스프링 시큐리티는 인증(Authentication) ,권한(Authorize) 부여 및 보호 기능을 제공하는 프레임워크
Spring Security는 강력하고 사용자 정의가 자유로운 인증 및 접근 제어 프레임워크입니다. Spring 기반 애플리케이션 보안의 사실상 표준입니다.
Java 애플리케이션에 인증과 권한을 부여(인가)를 모두 제공하는 데 중점을 둔 프레임워크이다.
- 인증(Authentication) : 해당 사용자가 누구인지 확인하는 절차
- 인가(Authorization) : 권한을 확인하고 접근을 제어
Spring Security는 '인증'과 '인가'에 대한 부분을 Filter의 흐름에 따라 처리한다. Filter는 Dispatcher Servlet으로 가기 전 가장 먼저 URL 요청을 받는다. 따라서 보안적인 검사를 가장 먼저 진행할 수 있다.
2. Spring Security 구조

위의 그림은 Spring Security의 인증 흐름 구조를 시각화한 것이다.
- 클라이언트의 로그인 요청
- 사용자가 로그인 폼을 통해 ID/PW를 입력하고 정해진 경로로 HTTP 요청을 보낸다.
- 이 요청은 AuthenticationFilter가 가로챈다. 가로챈 정보를 통해 UsernamePasswordAuthenticationToken 생성
- UsernamePasswordAuthenticationToken 생성
- 사용자의 입력값(ID, PW)는 UsernamePasswordAuthenticationToken 객체로 감싸져 전달된다.
- 이 객체는 인증 이전 상태(isAuthenticated = false)이다.
- AuthenticationManager에게 인증 요청
- AuthenticationFilter는 AuthenticationManager의 구현체인 "ProviderManager"에게 토큰을 넘긴다.
- 토큰을 검증해달라고 하는 것이다.
- AuthenticationProvider에게 위임
- ProviderManager는 내부에 여러 개의 AuthenticationProvider를 가지고 있으며, supports() 메서드를 통해 이 토큰을 처리할 수 있는 적절한 Provider를 선택한다.
- UserDetailsService 호출
- 선택된 AuthenticationProvider는 UserDetailsService를 호출해 DB에서 유저 정보를 가져온다.
- 우리가 직접 구현하는 CustomUserDetialsService가 여기에 해당한다.
- UserDetails 구현 객체 반환
- UserDetailsService는 UserDetails 인터페이스를 구현한 객체를 반환한다.
- 이 객체에는 유저의 아이디, 비번, 권한 정보가 들어있다.
- 비밀번호 비교 & 인증 확인
- AuthenticationProvider는 입력받은 비밀번호와 DB에서 가져온 비밀번호를 PasswordEncoder를 통해 비교한다.
- 성공 시 새로운 Authentication 객체를 만들고 isAuthenticated = true 상태로 반환한다.
- 인증 성공 -> AuthenticationManager로 결과 반환
- 인증된 Authentication 객체가 다시 AuthenticationManger에서 AuthenticationFilter로 전달된다.
- SecurityContextHolder에 인증 정보 저장
- 결국 이 Authentication 객체는 SecurityContextHolder에 저장된다.
- 이후 모든 요청은 이 SecurityContext에서 유저 정보를 꺼내 사용할 수 있다.(Ex : @AuthenticationPrincipal)
- 인증 완료 후 다음 필터로 진행
3. 마무리
이제 백엔드 개발을 하기 위해 스프링 시큐리티를 잘 다루는 것은 기본이라고 생각한다. 많은 기업에서 Spring Security와 JWT를 통해 인증 및 인가 기능을 구현했고, 그만큼 증명된 기술이라고 생각한다.
스프링 시큐리티의 기본 흐름과 구조를 잘 이해하면 JWT 기반 인증으로 커스터마이징, 소셜 로그인 연동, 커스텀 필터 및 Provider 구성, 로그인 성공/실패 처리 제어와 같은 작업들이 훨씬 쉬워지기 때문에 잘 기억해놔야겠다.