ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NHN]Spring Security 5 Oauth 총정리:클라부터 서버까지
    세미나, 영상 요약정리 2022. 8. 17. 03:08
    728x90

    https://www.youtube.com/watch?v=-YbqW-pqt3w 

     

    Spring Security란?

    Spring Framework 기반 인증, 인가를 담당하는 프레임워크

    Spring 기반 애플리케이션에서는 사실상 표준(de-facto standard)

     

    Spring Security 5 버전은 Spring Boot 2.0부터 Spring Framework 5.0 기반입니다.

    새로운 기능으로는 Oauth 2.0 Login입니다.

     

     

    위의 빨간 박스가 새로운 기능입니다.

     

    위의 기능이 대단하다고 하는데 왜 그런지에 대해서 알아보기 위해서는 Spring Security 5 이전에 Oauth가 어떻게 동작했는지 알아보겠습니다.

     

    Spring Security 5 이전의 Oauth

    Spring Security 4 까지는 서브 프로젝트로 Spring Security Oauth라는 별도 모듈로 존재했습니다.

    이 모듈은 Oauth 1.0, 2.0을 지원하고 Oauth Client, Resource Source, Authorization Server를 지원했습니다.

     

     

    Oauth 소개

    계속 Oauth에 대한 이야기가 나오기 때문에 Oauth가 무엇인지 알아야 합니다.

     

    Oauth란 내가 만든 사이트에서 페이스북과 같은 외부 사이트의 리소스를 가져오기 위해서는 외부 사이트의 ID와 Password를 직접 입력받아 사용하는 것이 아니라 토큰을 받아서 리소스에 접근합니다.

     

    Oauth에서 사용되는 역할들은 다음과 같습니다.

     

    Resource Owner

    자원에 대한 접근을 허가해 줄 수 있는 주체(페이스북 사용자)

     

    Resource Server

    자원을 호스팅하는 서버(페이스북 사진첩 서버)

     

    Client

    Resource Server에서 제공하는 자원을 사용하는 애플리케이션

    (외부의 제 3 애플리케이션으로 페이스북 사진첩의 사진을 이용할 수 있음)

     

    Authorization Server

    사용자(Resource Owner)의 동의를 받아서 권한을 부여하는 서버

     

     

    Oauth의 상호작용 방법

    1. 클라이언트가 Resource Owner에게 권한을 요청합니다.

    (내가 만든 사이트에서 페이스북 사진첩에 접근할 수 있는지 유저에게 권한을 요청합니다.)

     

    2. Resource Owner는 Authorization Grant를 얻습니다.

    Authorization Grant는 여러 가지가 존재하는데 이 중 하나의 방법이 authorizatino code입니다.

     

    3. 클라이언트는 Authorization Server에게 Access Token을 달라고 요청합니다.

     

    4. 클라이언트는 Resource Server에게 Access Token을 주고 이제 자원을 얻을 수 있습니다.

    (페이스북 사진첩에 접근할 수 있음)

     

     

    Spring Security 5 이전의 문제점

    - 기존의 form login이나 지금의 oauth login과는 코딩 스타일이 다르고 확장 포인트가 불명확했습니다.

     

    - Oauth Login 기능을 명시적으로 제공하지 않았습니다.

     

     

    Spring Boot 1.5부터는 @EnableAuth2Sso 어노테이션을 통해서 다양한 기능들을 추상화하여 제공하려고 했습니다.

     

    하지만 이러한 노력에도 Oauth를 구현함에 있어서는 대혼란이 발생합니다.

    - Spring Security 4 + Spring Security OAuth @EnableOAuthClient

    - Spring Boot 1.5 @EnableOAuth2Sso

    - Spring Social @EnableSocial

    - Spring Security 5 예정

     

    Oauth를 구현하는 다양한 방법들이 존재했으면 Spring Security 5 또한 예정되어 있었습니다.

     

    Spring Security 5가 제시한 장밋빛 미래

    기존의 Oauth 기능을 대통합하고자 했습니다.

    2018.11 - OAuth Client 기능 제공

    2019.10 - Resource Server 기능 제공

    2021.08 - Authorization Server 기능을 spring-authorization-server 프로젝트로 제공

     

     

    Oauth Client 설정 및 주의할 점

    흔한 Oauth2 Provider인 Google, GitHub, Facebook 등을 Spring구현할 경우에는 application.properties에 설정만 해주어도 간단하게 구현이 가능합니다.

     

    이때 Oauth2AuthorizedClientService의 기본 구현이 인메모리 형태입니다.

    (Client 관리기능를 위해 load, save, remove를 제공)

    실제 프로덕션 환경에서 유저가 로그인하면서 점점 메모리에 쌓이게 되고 OOM이 발생하거나 동기화되지 않은 여러 대의 서버에 번갈아서 접속하게 되면 인증정보가 사라질 수 있습니다.

     

    대안으로 JdbcOauth2AuthorizedClient를 사용하거나 직접 구현해야 합니다.

     

    OAuth Server 최소 설정

    spring-security-oauth2-authorization-server

    Security와 별개로 의존성이 필요합니다.

     

    Authorization Server를 위한 설정

    @Configuration(proxyBeanMethods = false) //Bean Write Mode로 동작하도록 설정
    public class AutorizationServerConfig{
    
    	//Filter 정보
    	@Bean
    	@Order(Ordered.HIGHEST_PRECEDENCE) //우선순위 최상위 지정
    	public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throw Exception{
    		OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); //security filter chain 구성
    		return http.formLogin(Customizer.withDefaults()).build(); //id, password login 지원
    	}
        
    	//OAuth Clinet 등록 정보
    	@Bean
    	public RegisteredClientRepository registeredClientRepository(){
    		//...
    	}
        
    	//JWS(Jwon Web Key Set)
    	@Bean
    	public JWKSource<SecurityContext> jwkSource(){
    		return (jwkSelector, securityContext) -> jwkSelector.select(new JWKSet(Jwks.generateRsa()));
    	}
        
    	@Bean
    	public ProviderSettings providerSettings(){
    		return ProviderSettings.builder().issuer("http://server.com:8080").build();
    	}
    }

    가장 우선순위가 높도록 @Order를 활용하여 OAuth Server 설정을 합니다.

     

    @Configuration만 사용하게 된다면 CGLib 프록시 패턴이 적요오디어 수동으로 등록하는 스프링 빈이 싱글톤으로 보장됩니다. 하지만 메서드가 호출할 때 의도적으로 다른 객체가 생성되도록 하기 위해 false옵션을 줄 수 있습니다.

    Authorization Server의 Endpoint들에만 적용되어야 하기 때문에 다른빈들에게 주입되지 않도록 합니다.

     

    Default Web Security Config 설정

    Authorization Server의 Endpoint들 이외의 요청들을 처리하기 위해 보통 WebSecurityConfigureAdpator를 상속받는 식으로 설정을 구성합니다.

    불행하게 아직까지는 Authorization Server를 위한 설정이 별도의 Secuirty Filter Chain을 등록을 하는 식으로 제공되기 때문에 @EnableWebSecurity를 명시적으로 호출하여 defaultFilterChain을 사용해야 합니다.

     

    UserInfo Endpoint는 (v0.2.0) 기준으로 구현이 아직 안되어 있음 - 이미 main 브랜치에 merge되어 있음

     

    댓글

Designed by Tistory.