04.29 학습

한강섭·2025년 4월 29일
0

학습 & 숙제

목록 보기
78/103
post-thumbnail

Security

🔐 Spring Security 기본 개념

  • Principal: 인증된 사용자 또는 이를 식별하는 정보로 사용자(계정), 디바이스, 시스템 등 행위의 주체
  • Secured Resource: 보안이 적용되는 리소스로 URL, API 엔드포인트, 파일 등
  • Authentication(인증): Principal이 믿을 수 있는지 파악하는 것으로 일반적으로 ID/PASS를 체크
  • Authorization(인가): 인증이 완료된 Principal이 어떤 행위를 할 권한이 있는지 확인하는 것 (role에 기반하여 필터링)

🛡️ 특징

  1. 인증, 권한 부여, 일반적인 공격에 대해 보호 기능을 제공하는 프레임워크
  2. 컨테이너에 무관하게 적용
  3. 관점의 분리
  4. 다양한 인증 방법 사용 가능, 사용자 정보 저장을 위한 방식을 설정으로 제공

🔄 절차

SecurityContext

  • Authentication을 세션에 보관하는 객체
  • SecurityContextHolder를 통해 접근
  • ThreadLocal에 저장되어 동일 스레드 내에서 언제든 현재 사용자 정보에 접근 가능

왜 세션에 저장하는데 ThreadLocal에도 저장할까..?
→ REST는 stateless이기 때문에 ThreadLocal에 저장!

Security Context 흐름


🔍 Filter

Servlet Application

Spring MVC는 물론 일반 Servlet Application을 지원하기 위해 servlet의 Filter 레벨에서 동작

SecurityFilter의 종류

  • CsrfFilter ← 이것만 외우자
  • LogoutFilter
  • UsernamePasswordAuthenticationFilter
  • RemeberMeAuthenticationFilter
  • AuthorizationFilter

필터 체인


❓ 질문

왜 Spring Security는 Filter 기반으로 되어있나요?

요청 전처리의 필요성 때문입니다. 보안 검사는 실제 비즈니스 로직이 실행되기 전에 이루어져야 합니다. 필터는 DispatcherServlet에 도달하기 전에 요청을 가로채므로, 컨트롤러에 도달하기 전에 인증과 권한 부여를 처리할 수 있습니다. 이는 인증되지 않은 요청이 애플리케이션 로직에 접근하는 것을 원천적으로 차단합니다.

또한 URL 기반 보안 설정의 용이성입니다. 웹 애플리케이션에서는 URL 패턴별로 다른 보안 정책을 적용하는 경우가 많은데, 필터는 URL 패턴 매칭을 통해 이러한 세밀한 보안 설정을 효과적으로 지원합니다.

필터는 Spring을 모르는데 이 Bean을 어떻게 가져올까?

Spring은 DelegatingFilterProxy라는 특별한 서블릿 필터를 제공합니다. 이 프록시는 두 세계를 연결하는 브릿지 역할을 합니다. 핵심은 ServletContext가 두 컨테이너 간의 연결 지점으로 작동한다는 것입니다.

Spring이 시작될 때, ContextLoaderListener가 Spring의 루트 ApplicationContext를 생성하고 이를 ServletContext의 속성으로 저장합니다. 이 메커니즘을 통해, 서블릿 컨테이너가 관리하는 일반 서블릿 필터는 Spring IoC 컨테이너의 빈을 참조하고 사용할 수 있게 됩니다.

이것이 Spring Security가 서블릿 필터 기반으로 동작하면서도 Spring의 모든 기능(의존성 주입, AOP 등)을 활용할 수 있는 이유입니다.


🔐 Authentication

SecurityContext: 현재 인증된 사용자의 인증 정보인 Authentication 객체를 가진다

Authentication interface 구성요소:

  • Principal: 사용자 식별 정보 → UserDetails 타입의 객체 활용
  • Credentials: 자격 증명 (password)
  • Authorities: ROLE_ADMIN, ROLE_USER

인증관리

  • AuthenticationManager: 인증을 수행하는 방법
  • ProviderManager: 실제 인증 작업 수행
  • 반환된 인증 정보는 SecurityContextHolder에서 관리됨

DaoAuthenticationProvider:

  • UserDetailsService를 이용해서 인증처리
  • InMemory와 Jdbc를 활용!
  • Jdbc는 Table 구조에 종속되어서 하나를 따로 만들어서 관리 (우리가 해야하는 것)

🔒 Authorization

Authentication 객체에 포함된 GrantedAuthority 목록을 사용하여 수행되는 프로세스

AuthorizationManager:

  • Secured resource에 대해 호출 권한 있니 (@PreAuthorize)
  • Secured resource에서 값을 반환할 수 있니 (@PostAuthorize)

계층적 role 관리

특정 role이 다른 role을 자동으로 포함해야 하는 경우

ROLE 설정을 위한 메서드

  • hasRole(role): 역할이 부여된 권한과 일치하는지 확인함
    • hasRole('ADMIN', 'STAFF') → ADMIN과 STAFF 권한 필요
  • hasAnyRole(role ... ): 부여된 역할 중 일치하는 항목이 있는지 확인함
    • hasAnyRole('ADMIN','STAFF') → ADMIN이나 STAFF 권한 필요
  • permitAll(): 모든 인증자의 접근 허가
  • denyAll(): 모든 인증자의 접근 금지
  • authenticated(): 인증이 된 경우는 허용

🔄 Spring 비동기 통신 과정 정리

비동기 통신 과정

profile
기록하고 공유하는 개발자

0개의 댓글