프로젝트를 진행하면서 Spring boot를 이용해 로그인와 회원가입을 구현해야한다.
여기서 Spring Security는 무엇이고 왜 사용하는지 공부해보자. 그 전에 인증과 인가라는 개념을 명확히 알고 넘어가보도록 하자.
🔊 인증과 인가
인증 (Authentication)
인증은 사용자의 신원을 확인하는 것이다. 사용자가 플랫폼에 로그인하면 이 사람이 누구인지 입증하는 것을 말한다.
인가 (Authorization)
반면에 인가는 인증과 다르게 이 사람의 권한을 확인하는 것이다. 특정 사용자가 관리자 권한을 가지고 있는지, 일반 사용자의 권리를 가지고 있는지 확인하는 것을 말한다.
이렇게 인증/인가를 간편하게 처리할 수 있도록 도와주는 것이 Spring Security이다!
✔ Spring Security란?
spring security는 스프링 기반의 인증, 인가, 권한을 담당하는 프레임워크이다. 보안과 관련된 기능을 쉽게 구현하고, 사용자가 안전하게 서비스를 이용할 수 있게 한다.
📌 Spring Security 필터 구조
Spring Security는 기본적으로 필터를 기반으로 동작한다. 필터를 커스텀할 수도 있고, 기존 필터를 제거할 수도있다. 그리고 이런한 필터를 Bean으로 등록할 수도 있다.
📑 FilterChain을 통한 요청 처리 흐름
Spring Security는 서블릿 필터 체인을 통해 작동하는 체인 기반 보안 구조를 가지고 있다.
공식 문서를 살펴보면 클라이언트가 특정 요청을 보낼 때 FilterChain을 통해서 필요한 인증, 인가를 처리한다는 것을 알 수 있다. 이 체인을 사용해 다양한 보안 기능을 순차적으로 적용한다.

만약 클라이언트가 로그인 요청을 한다고 생각해보자. 그러면 서블릿 컨테이너에서 요청을 받고 FilterChainProxy에 전달된다. 그리고 FilterChain의 각 필터들이 순차적으로 요청을 처리한다. 모든 보안 필터를 통과하면 최종적으로 서블릿에 도달하게 된다.
그리고 그 응답은 다시 서블릿 -> 필터체인 -> 클라이언트로 전달된다.

🤔 조금 더 깊숙히 생각을 해보자.
클라이언트가 API 요청을 보낸다고 가정하면
- FilterChain을 통해 필터들을 순차적으로 거친다
- Filter0 을 거친다. 여기서 Filter0은 Spring Security와 관련이 없는 서블릿 컨테이너에 등록된 필터이다.
- 그 후 DelegatingFilterProxy를 통해 FilterChainProxy를 호출한다. 여기에는 Spring Security 필터 체인을 포함하고있는데 이는 다양한 보안 필터로 구성되어있다.
- 그리고 Filter2를 거쳐 서블릿으로 요청이 전달된다.

만약에 Spring Security의 필터 체인을 거치고 싶지 않다면, ""permitAll()""을 통해서 특정 경로는 이 필터를 지나가지 않도록 설정할 수도 있다.
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // 인증/인가 필요 없음
.anyRequest().authenticated() // 그 외에는 인증 필요
);
📚 주요한 보안 필터들
| 필터 | 역할 |
| SecurityContextPersistenceFilter | SecurityContextRepository에서 기존 인증 정보를 불러오고 저장한다. |
| LogoutFilter | 설정된 로그아웃 URL로 오는 요청을 확인하고 사용자를 로그아웃 처리한다. |
| UsernamePasswordAuthenticationFilter | 폼 로그인(Form-based login)을 처리하며, 인증 성공 시 AuthenticationSuccessHandler를, 실패 시 AuthenticationFailureHandler를 실행한다. |
| DefaultLoginPageGeneratingFilter | 커스텀 로그인 페이지를 설정하지 않았을 경우 기본 로그인 페이지를 자동으로 생성한다. |
| BasicAuthenticationFilter | 요청 헤더의 아이디와 비밀번호를 파싱하여 인증 요청을 처리한다. |
| RequestCacheAwareFilter | 로그인 성공 후 캐시된 요청을 처리하여, 원래 요청한 페이지로 이동할 수 있도록 한다. |
| SecurityContextHolderAwareRequestFilter | HttpServletRequest를 래핑하여 SecurityContext에 저장된 인증 정보를 쉽게 사용할 수 있게 해준다. |
| AnonymousAuthenticationFilter | 인증되지 않은 사용자를 익명 사용자(AnonymousUser)로 설정하여, null 인증 객체를 방지한다. |
| SessionManagementFilter | 세션 정책 관리 및 중복 로그인 제어, 세션 고정 보호(Session Fixation Protection) 기능을 제공한다. |
| ExceptionTranslationFilter | 요청 처리 중 발생할 수 있는 예외를 위임하거나 적절히 처리한다. |
| FilterSecurityInterceptor | 접근 결정 관리자(AccessDecisionManager)로, 요청에 대한 최종 권한 검증을 수행하며, 권한이 없을 경우 403 Forbidden을 반환한다. |
참고로 FilterChainProxy는 Security Filter Chain을 통해 특정 url에 맞는 필터를 자동으로 적용시킨다.
스프링 시큐리티는 공부할 내용이 많은 것 같다!🤣
'🙋♀️ Server' 카테고리의 다른 글
| [Server] STOMP + WebSocket 테스트 문제 해결기 : Postman 활용 (0) | 2025.02.26 |
|---|---|
| [Server] CORS 오류 해결 & CORS가 뭘까 (0) | 2025.02.15 |
| [Server] Spring 패키지 구조, 각각의 기능 (0) | 2025.01.21 |
| [Server] Node.js + MySQL로 찜 기능 만들기 (0) | 2024.12.28 |
| [Server] sequelize를 이용한 중첩 조인 (0) | 2024.12.28 |