
✅ 스프링 시큐리티(Spring Security) 란?
: 스프링 기반 애플리케이션의 보안(인증, 인가 등)을 담당하는 스프링 하위 프레임워크.
- 보안 관련 많은 옵션 제공, 애너테이션 설정이 쉬움 → 개발자의 보안관련 로직 작성 부담 감소.
( *CSRF 공격 / *세션 고정 공격 방어 / 요청 헤더 보안 처리 제공 )
- 주로 서블릿 필터와, 서블릿 필터로 구성된 필터체인으로 구성된 위임 모델 사용.
(인증과 권한에 대한 부분을 필터의 흐름에 따라 처리.)
* CSRF 공격 : 사용자 권한을 가지고 특정 동작을 수행하도록 유도하는 공격.
* 세션 고정 공격 : 사용자 인증 정보 탈취/변조 하는 공격.
✅ 인증 & 인가 (Authentication & Authorization), 접근 주체 & 비밀번호 (Principal & Credential )
: Spring Security 에서는 인증 절차를 거친 후, 인가 절차를 실행한다.
인증/인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 Credential 기반 인증 방식을 사용한다.
인증 (Authentication) → (인증 성공 후) → 인가(Authorization)
📌 인증 (Authentication)
: 사용자의 신원 입증. 누구인지 확인하는 절차. (ex. 로그인)
- 식별 가능한 정보(이름, 이메일 등)으로 서비스에 등록된 유저의 신원을 입증하는 과정.
📌 인가 (Authorization)
: 사용자의 권한 확인. 사이트의 특정 부분/자원에 접근 가능한지 권한 확인하는 절차 (ex. 관리자 페이지)
- 인가 앞에 항상 인증이 선행되어야 한다.
📌 접근 주체 (Principal)
: 보호받는 자원(Resource)에 접근하는 대상 (ex. 아이디)
📌 비밀번호 (Credential)
: 자원(Resource)에 접근하는 대상의 비밀번호
⭐ 인증 vs 인가 (비교)
| 인증 (Authentication) | 인가 (Authorization) | |
| 기능 | 신원 입증 | 권한 허가/거부 |
| 진행방식 | 비밀번호, 생체인식 | 보안팀 설정 사용 |
| 사용자가 볼 수 있는가? | O | X |
| 사용자가 변경 가능한가? | △ (부분적 가능) | X |
| 데이터 전송 | Id 토큰 사용 | 엑세스 토큰 사용 |
✅ 필터 & 필터 체인
📌 필터 체인 (Filter Chain)
: 스프링 시큐리티는 다양한 필터들로 나누어져 있으며, 각 필터에서 인증/인가와 관련된 작업을 처리한다.
이러한 필터는 체인처럼 연결되어 있기 때문에 필터체인이라고 불린다.
- 특정 필터 제거 / 커스텀 필터 추가 가능.

📌 필터 종류 / 실행 순서
| 실행순서 | 필터명 | 설명 |
| 1 | SecutiryContext PersistenceFiter |
SecutiryContext (접근 주체 & 인증에 대한 정보를 담은 객체)를 조회/저장. |
| 2 | LogoutFilter | 설정된 로그아웃 URL로 오는 요청을 확인해 사용자 로그아웃 처리. |
| 3 | UsernamePassword AuthenticationFilter |
인증 관리자 :아이디/비번이 넘어오면 인증 요청 위임 - 폼 기반 로그인 시 사용되는 필터. - 아이디/패스워드 데이터를 파싱해 인증 요청 위임. - 인증 성공 시, AuthenticaitonSuccessHandler 실행. - 인증 실패 시, AuthenticationFailureHandler 실행. |
| 4 | DefaultLoginPage GenerationFilter |
사용자가 로그인 페이지를 따로 지정하지 않았을 때, 기본으로 설정하는 로그인 페이지 관련 필터. |
| 5 | BasicAuthenticationFilter | 요청 헤더에 있는 아이디/비번 파싱 → 인증 요청 위임 - 인증 성공 시, AuthenticaitonSuccessHandler 실행. - 인증 실패 시, AuthenticationFailureHandler 실행. |
| 6 | RequestCacheAwareFilter | 로그인 성공 후, 관련 있는 캐시 요청 확인/처리 ex) 로그인 X 상태로 방문했던 페이지를 기억해뒀다가, 로그인 이후 해당 페이지로 이동시켜줌. |
| 7 | SecurityContext HolderAwareRequsetFilter |
HttpServletRequest 정보를 감쌈. : 필터 체인 상, 다음 필터에게 부가 정보 제공을 위해 사용됨. |
| 8 | AnonymousAuthentication Filter |
필터 호출 시점까지 인증 X 시, AnonymousAuthentication(익명 사용자 전용 객체)를 만들어 SecurityContext에 넣어줌. |
| 9 | SessionManagementFilter | 인증된 사용자와 관련된 세션 관리 작업 진행. - 세션 변조 방지 전략 설정. - 유효하지 않은 세션 처리. - 세션 생략 전략 설정 등. |
| 10 | ExceptionTranslationFilter | 요청 처리 중 발생 가능한 예외 위임/전달. |
| 11 | FilterSecurity Interceptor |
접근 결정 관리자 : 권한 부여 처리를 위해 접근 제어 결정을 쉽게함. - AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉡게 해줌. - 이미 사용자가 인증되었으므로 인가 관련 설정 가능. |
✅ Spring Security 내부 구조

1. SecurityContextHolder
SecurityContext를 제공하는 static 메서드(getContext)를 지원함.
2. SecutiryContext
접근 주체와 인증에 대한 정보를 담고 있는 객체.
즉, Authentication을 담고 있음.
3. Authentication
Principal 과 GrantAuthority 제공.
인증 완료 시, 해당 Authentication 저장.
4. Principal
유저 정보.
대부분의 경우 UserDetails를 Principal 로 반환
5. GrantAuthority
Principal 이 가진 권한(ROLE_ADMIN, ROLE_USER 등)을 나타냄.
- 인가 시, 권한이 여러개일 수 있기 때문에, prefix(접두사)로 'ROLE_'이 붙는다.
(ex) ROLE_DEVELOPER, ROLE_ADMIN)
✅ Spring Security 인증 처리 과정 ( 아이디/패스워드 기반 폼 로그인 )

1. 사용자가 폼에 아이디/패스워드 입력 시(HTTP 요청 시),
HTTPServletRequest에 아이디/패스워드 정보가 전달됨.
이때, AuthenticationFilter가 넘어온 아이디/패스워드의 유효성 검사를 함.
2. 유효성 검사 후, UsernamePasswordAuthenticaitonToken (이하 Token) 을 생성해 넘겨줌.
(Authenticaiton 인터페이스의 실제 구현체)
3. 인증용 객체인 Token 을 AuthenticationManager 에게 보내,
해당 토큰이 올바른 유저인지 물어봄.
4. Token을 AuthenticationProvider 에게 보냄.
- AuthenticationManager 는 1개 이상의 AuthenticationProvider 를 갖고있다.
- AuthenticationProvider 는 Token 객체를 적절히 판단해 인증 처리를 한다.
5. 아이디를 UserDetailService에 보냄.
- UserDetailService는 아이디로 찾은 유저 정보로 UserDetails 객체를 만들고, 이를 AthenticcationProvider 에게 전달.
6. DB에 있는 유저 정보를 가져옴.
7. 입력 정보와 UserDetails의 정보 비교를 통해, 실제 인증 처리
8~10. 8~10까지 인증이 완료되면, SecurityContextHolder 에 Authentication 저장
- 인증 성공 시, AuthenticaitonSuccessHandler 실행.
- 인증 실패 시, AuthenticationFailureHandler 실행.
🌈 오늘 배운것 요약 정리 🌈
| 용어 | 설명 |
| 스프링 시큐리티 (Spring Security) |
보안(인증, 인가 등)을 담당하는 스프링 하위 프레임워크 |
| 인증 (Authenticaiton) | 유저의 신원을 확인/입증하는 절차 |
| 인가 (Authorization) | 인증된 사용자가 요청한 자원(Resource)에 접근 가능한지 결정하는 절차 |
| 접근주체 (Principal) | 보호받는 자원(Resource)에 접근하는 대상 |
| 비밀번호 (Credential) | 자원(Resource)에 접근하는 대상의 비밀번호 |
| 필터 체인 (Fitler Chain) | 스프링 시큐리티의 각 필터에서는 인증/인가에 대한 처리를 하는데, 이러한 필터들이 체인처럼 엮여있기 때문에 필터 체인이라 부름. |
회원가입/로그인/로그아웃 기능 구현에 앞서,
스프링 시큐리티의 기본 개념과 용어, 폼 로그인 인증의 내부 동작의 흐름을
공부하고 이해한 내용을 토대로 정리해보았다.
실제 기능 구현 시, 스프링 시큐리티를 더 잘 이해하고 활용할 수 있을 것 같다!
참고자료 :
https://wildeveloperetrain.tistory.com/50
https://dev-coco.tistory.com/174
https://velog.io/@mooh2jj/Security-%EC%9D%B8%EC%A6%9D%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC
스프링 부트 3 백엔드 개발자 되기: 자바 편
https://product.kyobobook.co.kr/detail/S000201766024
스프링 부트 3 백엔드 개발자 되기: 자바 편 | 신선영 - 교보문고
스프링 부트 3 백엔드 개발자 되기: 자바 편 | ★ 자바 백엔드 개발자가 되고 싶다면 ★ 자바 언어 입문 그다음에 꼭 보세요실력을 갖춘 개발자로 성장하려면 시작이 중요합니다. 그래서 이 책은
product.kyobobook.co.kr