본문 바로가기
Spring Boot

[Spring Security 입문하기] 2. 인증(Authentication)과 인가(Authorization)

by ZIAHO 2025. 3. 27.
Spring Security 입문하기

[Spring Security 입문하기] 1. 개요와 기본 동작 원리

 

안녕하세요.

 

이전 글에서는 Spring Security가 어떤 프레임워크인지, 어떤 보안 기능을 제공하는지,
그리고 FilterChain 기반의 구조와 전체적인 동작 흐름에 대해 간단히 정리해보았습니다.

 

이번 글에서는 Spring Security의 가장 핵심 개념인

인증(Authentication)
인가(Authorization)
의 개념과 동작 흐름에 대해서 알아보도록 하겠습니다.


📌 인증(Authentication) 이란?

누구세요?

 

인증이란, 요청을 보낸 사용자가 누구인지 확인하는 과정 입니다.

우리가 애플리케이션을 사용하기 위해 거의 필수적으로 하는 로그인이 바로 인증의 대표적인 예시 입니다.

사용자가 아이디와 비밀번호를 입력.
아이디와 비밀번호가 DB상에 저장되어 있는 데이터와 일치하면 인증 성공.
인증된 사용자 정보는 SecurityContext에 등록된다.

📝  1. 인증 흐름

[사용자의 로그인 요청]
                ↓
UsernamePasswordAuthenticationFilter
                ↓
AuthenticationManager
                ↓
UserDetailsService → UserDetails
                ↓
PasswordEncoder
                ↓
(인증에 성공했다면) SecurityContextHolder 에 인증 정보 저장

 

Spring Security에서의 인증은 위와같은 흐름으로 이루어집니다.

그렇다면, 각 내부 구성 요소들이 어떤 역할을 하는지에 대해 알아보겠습니다.


📝  2. 인증 관련 내부 구성요소

구성요소 설명
UsernamePasswordAuthenticationFilter 로그인 요청을 가로채는 필터.
사용자가 입력한 값을 기반으로 인증 요청 객체( Authentication)를 생성한다.
Authentication 인증 요청 정보를 담는 인터페이스.
아이디, 패스워드, 권한 등의 정보가 포함되어있다.
AuthenticationManager 인증 처리를 담당하는 인터페이스.
기본 구현체는 ProviderManager.
AuthenticationProvider 인증 로직을 수행하는 컴포넌트.
UserDetailsService 사용자 정보를 조회하는 인터페이스.
UserDetails 사용자 정보를 담는 객체.
PasswordEncoder 입력된 비밀번호와 저장된 비밀번호를 비교하는 인터페이스.
보통  Spring Security 에서 기본적으로 제공하는 BCryptPasswordEncoder사용.
SecurityContextHolder 현재 인증된 사용자의 정보를 저장하는 곳.

 

💡 BCryptPasswordEncoder
BCryptPasswordEncoder는 BCrypt 해시 함수를 사용하는 PasswordEncoder의 구현체로, Spring Security에서 기본적으로 제공해줍니다.
같은 비밀번호라도 매번 다른 해시값을 생성하고, 일부러 느리게 설계되어 있어 무차별 대입 공격을 어렵게 만드는 특징을 가지고 있습니다.
또한, 단방향 암호화이기 때문에 복호화가 불가능하여, 비밀번호가 일치한지 확인할 때에는 matches()를 사용합니다.

📌 인가(Authorization) 란?

넌 못지나간다

 

인가란, 인증이 된 사용자가 해당 리소스에 접근할 권한이 있는지 판단하는 과정을 말합니다.

어떤 기능을, 어떤 조건에서, 허용을 할 것인가? 를 판단하는 것입니다.

예를들어, 관리자 페이지에는 관리자만 접근이 가능하고 일반 사용자는 접근이 불가능하겠죠?

 

저는 문지기의 역할을 한다라고 생각하니까 이해가 빠르게 됐습니다.


📝  1. 인가 흐름

[사용자 요청]
         ↓
FilterSecurityInterceptor (인가 필터)       
         ↓
AccessDecisionManager (권한 판단)
         ↓
Authentication.getAuthorities() 와 비교
         ↓
접근 허용 or 접근 거부 (AccessDeniedException)

 

Spring Security에서의 인가는 위와같은 흐름으로 이루어집니다.

그렇다면, 각 내부 구성 요소들이 어떤 역할을 하는지에 대해 알아보겠습니다.


📝  2. 인가 관련 내부 구성요소

단계 구성요소 역할
1 FilterSecurityInterceptor 요청된 리소스에 대한 인가 처리를 담당하는 인가 처리의 핵심 필터.
SecurityFilterChain의 마지막에 위치.
2 SecurityMetadataSource 요청 리소스에 필요한 권한 정보를 제공한다.
3 AccessDecisionManager 현재 사용자의 권한과 리소스의 요구 권한을 비교하여 인가 여부를 결정.
4 Authentication.getAuthorities() 인증된 사용자의 권한 목록 (ex: ROLE_USER, ROLE_ADMIN)
5 AccessDeniedHandler 인가 실패 시 처리 (ex: 403 Forbidden)

 

💡SecurityMetadataSource가 어떻게 요청 리소스에 필요한 권한 정보를 가지고 있을까?
개발자가 Java Config 파일이나 XML로 설정한 URL 권한 매핑 정보를 애플리케이션 시작 시 읽어와서 구성한다.

🌟 내부 구성요소들이 다소 복잡하게 느껴지긴 하는데...

그래도 이 구성요소들이 어떤 역할을 하는지 파악해두면 인증 / 인가 관련 커스터마이징을 하거나 디버깅을 할 때 편하게 할 수 있습니다.

예를 들면 :

  • 로그인 필터를 커스터마이징 하고싶어! → UsernamePasswordAuthenticationFilter 를 상속 후 수정
  • 사용자 권한에 따른 접근 제한을 설정하고싶어! → authorizeHttpRequests() 설정 부분 수정

이렇게요.

 


✅ 다음 글에서는 인증과 인가에 대한 실습을 진행해보도록 하겠습니다.

간단한 로그인 페이지를 구현해보면 좋을것같아요.

 

  우선은 학습용으로 진행을 할 예정이다보니 DB를 따로 연결하지 않고 In-Memory 방식으로 진행을 할 예정인데,

진행을 하다 보면 계획이 바뀔수도 있을것같습니다. ㅎ