[Spring] Spring Security 정리

2025. 5. 1. 19:57·Spring

🔐 Spring Security란

 

Spring Security는 Spring Framework에서 보안이나 인증・인가에 사용되는 프레임워크이다.

 

 

일단 인증과 인가가 무엇인지부터 확실하게 정리하자.

 

  • 인증(Authentication) : 사용자가 누구인지 확인하는 절차 (로그인을 위해 입력한 정보가 본인이 맞는지 확인)

  • 인가(Authorization) : 인증된 사용자가 특정 자원에 접근할 권한이 있는지 확인하는 절차

 

Spring Security는 다양한 기능을 제공하지만, 핵심은 대부분 인증과 인가, 그리고 이 과정에서 파생되는 부가 기능들로 구성되어 있다.

 

 

Spring MVC만 사용할 경우, 클라이언트의 요청이 Origin 서버로 전달되기 전에 필터나 인터셉터를 통해 요청이 악의적인지, 인증은 되었는지, 인가가 적절한지를 개발자가 직접 구현해야 한다.

 

 

하지만 Spring Security를 사용하면, 이러한 인증・인가 과정을 처리하기 위한 다양한 필터와 인터셉터를 기본적으로 제공하기 때문에, 복잡한 보안 로직을 일일이 구현하지 않아도 된다.

 

 

 

🤔 Spring Security 인증 방식

 

그렇다면 Spring Security에서 제공되는 Filter와 Interceptor는 어떤 방식으로 인증과 인가를 처리할까?

 

 

즉, 클라이언트가 보내는 요청의 무엇을 근거로 해당 사용자가 적합한지 아닌지를 어떻게 판별할 수 있을까?

 

 

Spring Security는 기본적으로 사용자의 아이디(Principal)와 비밀번호(Credentials)를 기반으로 인증을 수행한다.

 

 

실제로 현재 배포되어 운영 중인 대부분의 서비스들은, 사용자가 로그인할 때 아이디와 비밀번호를 통해 본인임을 증명하고, 이를 바탕으로 서비스를 이용할 수 있도록 한다.

 

 

Spring Security도 이러한 방식과 크게 다르지 않다.

 

 

실제로 DB에 존재하는 회원의 아이디와 비밀번호를 토대로 인증용 객체를 만드는 것이다.

 

 

 

🛠️ Spring Security 구조 및 흐름

 

일단 Spring Security를 사용한 사용자의 인증・인가를 설명하기 위해선 내부 구조를 알아야 한다.

 

 

 

1. 사용자가 HTTP 요청을 서버에게 보낸다.

 

사용자가 HTTP 헤더에 인증에 필요한 정보를 추가한 후, 서버에게 요청을 보낸다.

 

 

2. 사용자의 요청이 AuthenticationFilter이 가로채고, UsernamePasswordAuthenticationToken 객체를 생성한다.

 

사용자가 인증을 위해 입력한 아이디(Username)와 비밀번호(Password)가 있을 것이다.

 

이 둘을 사용해 사용자 인증용 토큰 객체를 생성한다.

 

 

3. AuthenticationManager의 구현체인 AuthenticationProvider에게 생성한 UsernamePasswordAuthenticationToken을 전달한다.

 

AuthenticationProvider에서 UserDetailService을 통해 입력된 아이디, 비밀번호가 일치하는 회원 정보가 DB에 있는지 조회한다.

 

이 과정에서 크게 두 가지 로직이 수행되는 데, authentication() 와 supports() 메서드이다.

 

  • authentication() : 사용자가 입력한 아이디와 비밀번호를 토대로 DB에 해당 정보가 있는지 조회한다.
  • supports() : 현재 AuthenticationProvider가 제공된 Authentication 객체 유형을 지원하는 경우 true를 리턴하고, authentication() 로직을 수행할 수 있도록 한다.
AuthenticationManager.authenticate(Authentication authentication)
    └ for each AuthenticationProvider:
        └ if provider.supports(authentication.getClass()) == true:
            └ return provider.authenticate(authentication)

 

참고로 인증용 객체인 Authentication은 인터페이스로 다양한 구현체가 존재한다. (UsernamePasswordAuthenticationToken, AnonymousAuthenticationToken, OAuth2AuthenticationToken 등등..)

 

 

4. 모든 AuthenticationProvider의 authentication() 메서드가 완료되었으면 사용자의 정보를 담은 Authentication 인증용 객체가 리턴된다.

 

이 리턴된 Authentication 객체는 최초로 인증 메서드를 호출한 클래스인 AuthenticationFilter에 리턴된다.

 

 

5. Authentication 객체를 인증 정보 저장용 공간인 SecurityContext에 저장한다.

 

인증이 완료된 Authentication 객체를 SecurityContext에 저장하고, 이후 사용자의 HTTP 요청을 DispatcherServlet으로 전달한다.

SecurityContext를 사용하는 이유는, Spring 애플리케이션 내 어디에서든지 인증된 사용자의 정보를 쉽게 조회할 수 있도록 보관하기 위함이다.

 

이 덕분에 컨트롤러, 서비스 등 다양한 계층에서 현재 로그인한 사용자의 정보를 사용할 수 있다.

 

 

 

🤔 SecurityContext

 

여기서 한 가지 궁금증이 생길 수 있다.

 

“모든 사용자가 SecurityContext에 인증 객체를 저장하고 사용한다면, 사용자 간에 정보가 섞이는 건 아닐까? 어떻게 내 정보를 정확하게 찾아서 조회하는 거지?”

 

 

그 이유는 SecurityContext는 ThreadLocal 기반으로 동작하기 때문에, 요청을 처리하는 각각의 스레드마다 독립적으로 관리된다.

 

 

즉, SecurityContext 자체는 JVM의 힙 영역에 존재하지만, HTTP 요청을 처리하는 개별 스레드에 바인딩되어 사용되므로, 다른 요청의 인증 정보와는 절대로 공유되지 않는다.

'Spring' 카테고리의 다른 글

[Spring] Spring Cache 어노테이션  (0) 2025.05.15
[Spring] Spring Cache  (0) 2025.05.15
[Spring] MySQL, MongoDB 전략 패턴  (0) 2025.04.23
[Spring] Spring 프로젝트 SonarQube 연동  (0) 2025.01.09
[Spring] Spring Batch를 사용한 대량 데이터 저장 (2)  (0) 2024.12.22
'Spring' 카테고리의 다른 글
  • [Spring] Spring Cache 어노테이션
  • [Spring] Spring Cache
  • [Spring] MySQL, MongoDB 전략 패턴
  • [Spring] Spring 프로젝트 SonarQube 연동
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring N
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[Spring] Spring Security 정리
상단으로

티스토리툴바