
안녕하세요. 오늘은 Spring Boot의 중요한
스프링 시큐리티(Spring Security)에 대해 간단히 알아볼게요.
Spring Security 란?
스프링 프레임 워크 기반 애플리케이션에서 보안(인증, 인가, 권한)을 담당하는 보안 프레임 워크로
다양한 어노테이션으로 CSRF공격, 세션 고정 공격을 방어하는 친구에요.
인증 방식 (폼 로그인, OAuth2, JWT 등)을 지원함으로써 유연한 확장성을 가지기 때문에
표준화된 구조로 보안코드가 일관되면서 유지보수가 쉽고, 보안 기본기를 자동 제공이 되요.
(ex- 비밀번호 암호화, 세션 / 토큰인증, 권한 체크, CSRF 보호 등)
Security의 주요 개념
1. 인증(Authentication)
사용자가 누구인지 확인하는 절차로 하나의 예시를 들자면
회원의 로그인을 위해 아이디와 비밀번호를 통해 본인이 맞는지 확인해요.
성공 시, Authentication 객체를 생성하여 SecurityContext에 저장(기록)해요.
2. 인가(Authorization)
인가는 인증을 통해 로그인한 사용자가 요청한 자원에 접글할 수 있는 권한이 있는지 검사하는 친구로
"인증된" 사용자가 특정 리소스(데이터)에 접근할 수 있는 권한인지 확인하는 과정을 통해
관리자만 특정 페이지에 접근 가능하거나, 특정 데이터를 호출할 수 있도록 설정을 해줘요.
Spring Security 전체 처리절차
스프링 시큐리티 전체 처리절차를 정리했는데요.
인증과 인가를 분류해서 같이 정리해 봤어요.
* 인증(Authentication) 절차 *
1. HTTP 요청
첫 번째 HTTP 요청으로 사용자가 브라우저/앱에서 요청을 보냅니다.
데이터나 인증 정보(JWT 토큰)가 포함되어 있을 수 있고, 없을 수도 있어요.
2. SecurityFilterChain - 검문소 라인
인증 정보 여부 상관없이 모든 요청을 거쳐가는 라인이에요
여기서는 JWT 토큰이 있는지(JwtAuthenticationFilter, 커스텀 Filter에 전달), 그리고 보호된 URL인지 확인합니다.
3. AuthenticationManager/Provider - 신원확인 부서
여기는 로그인 시도가 들어오면 필터가 아이디/비밀번호를 요청해서 꺼낸 다음
AuthenticationManager에게 전달합니다.
그리고 여러 AuthenticationProvider에게 일을 시키는데
이 친구의 역할은 해당 아이디와 비밀번호가 일치하는지 확인과
DB 기반 로그인, 소셜 로그인, JWT 검증 등 다양한 Provider가 일을 해결해요.
간단하게 비유하자면 AuthenticationManager는 "관리자" 역할
AuthenticationProvider는 "직원, 하청업체" 역할이라고 생각하시면 됩니다.
4. UserDetailsService - 사람 찾기 창구
Provider가 아이디를 받으면 UserDetailsService를 호출하여 해당 유저를 DB에 찾고,
그 결괏값을 UserDetails 객체로 변환해 줘요.
5. PasswordEncoder - 비밀번호 검증 담당
UserDetailsService에서 가져온 비밀번호는 암호화(BCryct 해시) 되어있어요.
사용자가 입력한 비밀번호와 DB 해시값을 Encoder가 비교를 하고
일치하면 인증 성공, 틀리면 실패로 반환하게 돼요.
6. SecurityContext / SecurityContextHolder - 현재 로그인 정보 저장소
로그인 인증이 성공적으로 된다면 스프링 시큐리티는 SecurityContext 안에 로그인된 유저 정보를 저장해요.
SecurityContextHolder에서 보관을 하고, 같은 요청 시 언제든 꺼낼 수 있어요.
그리고 서비스와 컨트롤러에서 Authentication 타입의 매개변수로 로그인 사용자 정보에 접근이 가능해요.
* 인가(Authorization) 절차 *
7. Authorities (권한) - 어디까지 접글할 수 있는지 확인
UserDetails 안에 유저가 가진 권한(ROLE) 정보가 저장되어 있는데
필터체인을 통해 요청된 URL과 권안을 비교하여 맞으면 통과, 아니면 접근할 수 없어요.
8. EntryPoint / AccessDeniedHendler - 실패 처리
만약 절차 중 인증이 안 됐거나(로그인 X), 권한이 부족할 경우 오류처리를 진행하는데
인증/인가 실패를 다르게 처리합니다. 이때 사용하는 두 컴포넌트가 다음과 같아요.
인증 -> AuthenticationEntryPoint - 로그인 필요 : 401 Unauthorized
인가 -> AccessDeniedHandker - 권한 없음: 403 Forbodden
스프링 시큐리티 구성 요소 설명은 간단하게 표로 정리했어요.
| SecurityFilterChain | 보안 필터들의 체인. 요청이 들어올 때 이 필터를 거쳐 감 |
| AuthenticationManager | 인증을 담당하는 핵심 컴포넌트 |
| UserDetailsService | 사용자 정보를 DB 등에서 불러오는 인터페이스 |
| UserDetails | 사용자 정보를 담는 객체 |
| GrantedAuthority | 권한 정보를 담는 인터페이스 (ex: ROLE_USER) |
스프링 시큐리티 선행 개념
스프링 시큐리티를 제대로 이해하고 활용하기 위해서는 몇 가지 선행 개념을 알고 있어야 해요.
주요 선행 개념들을 간단히 표로 설명드릴게요.
| 인증(Authentication) | 누군지 확인 | “이 사람이 진짜 주인인가?” |
| 인가(Authorization) | 무엇을 할 수 있는지 확인 | “이 사람은 이 방에 들어가도 되나?” |
| 세션 | 서버가 로그인 상태 기억 | 집주인이 방문자 명부에 기록 |
| JWT | 토큰 기반 인증, 서버 저장 안 함 | 방문증을 직접 들고 다님 |
| 해싱 (BCrypt) | 비밀번호 안전하게 암호화 | 비밀번호를 암호화된 열쇠로 바꿈 |
| SecurityContext | 현재 사용자 정보 저장 | 현재 누가 집에 있는지 기록 |
| Filter Chain | 요청 검사 필터 묶음 | 집 문에서 여러 번 확인하는 문지기 |
| CSRF 방어 | 악성 요청 방지 | 방문증 위조 방지 |
| CORS | 다른 도메인 접근 제한 | 이웃집 출입 허락 여부 |

여기까지 간단하게 스프링 시큐리티에 대해 알아봤는데요.
아주 기본적인 정보만 보여드렸는데도 내용이 많은 게 느껴져요.
저도 스프링 시큐리티 배우고 있기 때문에 많이 부족하지만
꾸준한 복습으로 자기 것으로 만들었으면 좋겠어요.
'Backend > Java' 카테고리의 다른 글
| Spring Security - Filter, Provider, Config (0) | 2025.09.02 |
|---|---|
| Spring Boot - JWT (0) | 2025.08.31 |
| Java - List vs Set (0) | 2025.08.25 |
| Spring Boot - 필터링 & 검색 기능 (0) | 2025.08.22 |
| Spring Boot - Validation (0) | 2025.08.20 |