Spring Security @EnabledWebSecurity 의 동작원리

2024. 6. 17. 17:08Spring Boot

반응형

Spring Security?

 

Spring의 공식문서에 따르면,
Spring Security는 강력하고 사용자 정의가 가능한 인증 및 액세스 제어 프레임워크입니다.
(Spring 기반 애플리케이션 보안을 위한 사실상의 표준)

Java 어플리케이션에 인증 및 권한 부여를 제공하는 데 중점을 둔 프레임 워크라고 할 수 있죠.

like 문지기
  • 인증 및 권한 부여에 대한 포괄적이고 확장 가능한 지원
  • 세션 고정, 클릭재킹, 크로스 사이트 요청 위조 등과 같은 공격으로부터 보호
  • 서블릿 API 통합
  • Spring Web MVC와의 선택적 통합 등… 다양한 특징을 가지고 있습니다!

 

@ 어노테이션

 

그렇다면 제목의 EnabledWebSecurity앞에 붙어있는 @는 무엇일까요?

이해를 위해서는 메타데이터 라는 개념을 짚고 넘어갈 필요가 있습니다!

 

메타데이터란 데이터의 대한 속성정보로, 하위 레벨 데이터를 설명하는 또다른 데이터라고 보면 됩니다.

도서관을 예시로 들어보자면 표제,저자,주제명,분류기호 등이 포함되어 있는 목록이 메타데이터의 속한다고 볼 수 있습니다 🙂

 

어노테이션이란 이러한 메타데이터라고 볼 수 있는데요, 본래 주석이라는 의미를 가지고 있습니다!

프로그램 실행 관점에서보면 프로그램이 처리할 메인 데이터가 아니라 실행 과정에서 데이터를 어떻게 처리할것인지 알려주는 서브 데이터라고 볼 수 있습니다!

 

어노테이션은 크게 세 가지 용도로 사용됩니다.

  1. 코드 문법 에러 체크 
  2. 코드 자동 생성 정보 제공 
  3. 런타임시 특정 기능을 실행하는 정보 제공 

 

 

 

@EnabledWebSecurity

 

@EnableWebSecurity 애노테이션은 Spring Security를 사용하는 웹 애플리케이션에서 보안 구성을 활성화하는 데 사용됩니다!
이 애노테이션은 WebSecurityConfigurerAdapter를 확장한 클래스를 정의하거나, SecurityConfigurerAdapter를 사용하여 보안 구성을 정의하는 데 필요한 메서드를 구현하는 클래스에 적용됩니다.

실제 RPM 코드에서 다음과 같이 사용되고 있지요

이 애노테이션을 사용하면 Spring Security가 제공하는 기본 보안 구성을 활성화하고, 웹 애플리케이션의 인증 및 권한 부여를 조절할 수 있습니다. 주로 사용자 인증, 권한 부여, HTTPS 설정, 로그인 페이지 커스터마이징 등과 관련된 보안 설정을 구성할 때 활용됩니다.

 

 

@EnabledWebSecurity  파헤치기

 

그렇담 해당 어노테이션이 어떻게 정의되어있는지 조금 더 파헤쳐보겠습니다.

 

 

해당 어노테이션에 설정된 값들을 하나씩 해석해보겠습니다!

@Retention(RetentionPolicy.RUNTIME)이 어노테이션의 유지 정책을 RUNTIME으로 지정합니다. 이는 런타임 시에도 어노테이션 정보가 유지되어야 함을 나타냅니다.

@Target(ElementType.TYPE) 이 어노테이션을 타입(ElementType.TYPE)에 적용할 수 있음을 나타냅니다. 즉, 클래스나 인터페이스에 이 어노테이션을 적용할 수 있습니다.
@Documented Javadoc에 이 어노테이션 정보를 포함하도록 지정합니다. 즉, 문서화할 때 이 어노테이션 정보가 포함됩니다.
@Import({ WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class, HttpSecurityConfiguration.class }) 해당 어노테이션이 사용될 때 가져와야 하는 구성 클래스 및 선택자들을 지정합니다.
WebSecurityConfiguration,
SpringWebMvcImportSelector,
OAuth2ImportSelector,
HttpSecurityConfiguration 등이 가져와지게 됩니다.
@EnableGlobalAuthentication 전역 인증을 활성화하는데 사용되는 어노테이션입니다. 이 어노테이션을 사용하면 전역적으로 인증 구성을 할 수 있습니다.
@Configuration 해당 어노테이션이 클래스가 구성 클래스임을 나타냅니다. 이 어노테이션이 붙은 클래스는 스프링 컨테이너에서 빈으로 등록될 수 있습니다.

 

이곳에서 Import 항목을 보면 WebSecurityConfiguration 클래스를 포함하고 있는데, 해당 클래스의 내부를 살펴보면

 

springSecurityFilterChain이라는 메소드가 빈을 등록하고 있는 것을 확인할 수 있습니다!

이 빈이 바로, 스프링 필터 체인을 정의하는 빈입니다.

필터체인?
-> 여러 개의 필터를 묶어놓은 것

이 필터 체인이 WebSecurityConfiguration에 의해 등록되는 것이며 이는 다시 EnableWebSecurity에 의해 등록되어지는 구조를 갖게 됩니다.

 

springSecurityFilterChain

Spring Security 에서 제공하는 인증,인가를 위한 필터들의 모음입니다.
Spring Security 에서 가장 핵심이 되는 기능을 제공하며, 거의 대부분의 서비스는 Security Filter Chain 에서 실행된다고 이해하면 됩니다.

 

 

@EnableGlobalAuthentication

 

애노테이션으로 정의된 EnabledWebSecurity 내부 구현을 살펴본 결과,

WebSecurityConfiguration.class,

SpringWebMvcImportSelector.class,

OAuth2ImportSelector.class,

HttpSecurityConfiguration.class들을 import해서 실행시켜주는 것을 알 수 있습니다!

 

그 외에 @EnableGlobalAuthentication 구현부를 살펴보면 다음과 같습니다.

 

해당 어노테이션은 AuthenticationConfiguration 클래스를 Import 하는데, 해당 클래스를 살펴보면

AuthenticationManagerBuilder를 통해 전역적으로 사용될 사용자 정보를 구성할 수 있습니다..!

 

 

@EnabledWebSecurity  동작원리

 

결론적으로 @EnableWebSecurity 어노테이션을 사용하게 되면 다음과 같은 설정정보들이 마법과 같이 추가됩니다.

짜잔-

 

   

WebSecurityConfiguration

스프링 필터 체인을 정의

SpringWebMvcImportSelector

Spring Security 설정에 Spring Web MVC와 관련된 구성을 추가
(웹 애플리케이션에서의 보안 설정과 웹 MVC 설정을 통합)

OAuth2ImportSelector

Spring Security 구성에 OAuth 2.0 인증 및 권한 부여를 위한 필수 구성을
자동으로 추가

HttpSecurityConfiguration

HttpSecurityConfiguration 클래스가 WebSecurityConfigurerAdapter를 확장하여
구현되며, HttpSecurity를 구성하여 보안 규칙을 적용

AuthenticationConfiguration

@EnableGlobalAuthentication 어노테이션이 포함하는 클래스로,
전역적으로 사용될 사용자 정보를 구성할 수 있게 함

다음과 같은 Security 기능들을 어노테이션 하나로 활성화시킬 수 있는 아주 유용한 녀석이라고 볼 수 있겠습니다 🙂

 

 

 

✨ 참고 (Reference)

 

https://blog.naver.com/PostView.naver?blogId=gngh0101&logNo=222056047335&parentCategoryNo=&categoryNo=32&viewDate=&isShowPopularPosts=false&from=postView

 

Spring Security EnableWebSecurity 내부 속으로 -1 (AuthenticationConfiguration)

Spring Security EnableWebSecurity 내부 속으로 -1 (AuthenticationConfiguration) EnableWebSe...

blog.naver.com

 

https://k39335.tistory.com/40

 

[JAVA] Annotation(어노테이션) 이란?

[JAVA] Annotation(어노테이션) 이란? Annotation어노테이션이란 본래 주석이란 뜻으로, 인터페이스를 기반으로 한 문법이다. 주석과는 그 역할이 다르지만 주석처럼 코드에 달아 클래스에 특별한 의미

k39335.tistory.com

 

https://spring.io/projects/spring-security/

 

Spring Security

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications. Spring Security is a framework that focuses on providing both authentication and authoriz

spring.io