스프링 시큐리티 OAuth2 설정에 관한 질문입니다.

24.03.12 15:04 작성 조회수 44

0

안녕하세요, 스프링 시큐리티에서 OAuth2 방식으로 로그인 하는도중 질문 드릴것이 있습니다.

  security:
    oauth2:
      client:
        registration:
          okta:
            client-id: "클라이언트 ID"
            client-secret: "클라이언트 시크릿"
            redirect-uri: http://localhost:8080/oauth2/okta/sign-in
            scope:
              - profile
              - email
              - openid
        provider:
          okta:
            issuer-uri: "테스트URI"

먼저 yml파일에서 위와같이 설정해 놓았으며, okta내의 리다이렉트 URI도 동일하게 설정해두었습니다.

그런데 예전에 진행했던 구글 로그인에서는 인증이 성공하면 code를 가져와서 AccessToken을 자동으로 발급받고, 사용자 정보까지 스프링 시큐리티가 알아서 가져온 이후, CustomOAuthSuccessHandler에서 처리했던것으로 기억합니다.

그 당시에는 리다이렉트 URI가 http://localhost:8080/oauth2/code/google와같은 형식이었어서 시큐리티에서 감지하고 자동으로 엑세스토큰까지 가져온걸까요?

현재는 Okta 인증이후 http://localhost:8080/oauth2/okta/sign-in 로 code를 파라미터로 가지고 도착하여, 컨트롤러에서 okta인증서버에 수동으로 엑세스토큰을 받아오고 있습니다. 이로인해 CustomOAuthSuccessHandler도 사용하지 못하고 있는 상황이고, SecurityContext를 불러와서 수동으로 로그인처리를 완료하고 있습니다.

 

물론 기능상에 문제는 없어보이지만.. 어떻게 봐도 코드가 깔끔하지 못하고, 시큐리티를 잘못 사용하고 있는것같아, 여러 문서들을 참고해 보았지만.. 짧은 지식으로는 완벽히 이해하기 힘들어 난항을 겪고있습니다.

 

꼭 시큐리티에서 default로 설정해둔 uri 형식을 맞춰야 실행되는걸까요?

그렇지 않다면 사용하고 싶은 uri로 설정하기 위해서는 어떤 방법이 있을까요?

키워드라도 공유해 주신다면 열심히 찾아서 적용해보겠습니다.

감사합니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.13

안녕하세요, 인프런 AI 인턴입니다.

김심바님, 스프링 시큐리티의 OAuth2 로그인 설정과 관련해 질문해주셨군요.

드렸던 질문에서 언급하신 http://localhost:8080/oauth2/okta/sign-in와 같은 리다이렉트 URI를 사용하는 경우, 스프링 시큐리티는 기본적으로 /login/oauth2/code/* 패턴의 URL을 처리할 때만 자동으로 엑세스 토큰을 가져오고 사용자 정보를 처리합니다.

그러나 스프링 부트는 커스텀 리다이렉트 URI를 사용할 가능성을 염두에 두고 확장성을 제공합니다. 커스텀 리다이렉트 URI를 사용하기 위해서는 SecurityFilterChain을 직접 정의해서 OAuth2 로그인 설정을 추가할 수 있습니다.

예를 들어, 아래와 같이 자바 코드에서 SecurityFilterChain을 설정하여 커스텀 URI 패턴을 처리하도록 할 수 있습니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
public class MyOAuthClientConfiguration {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((requests) -> requests
                .anyRequest().authenticated()
            )
            .oauth2Login((login) -> login
                .redirectionEndpoint((endpoint) -> endpoint
                    .baseUri("/login/oauth2/callback/*")
                )
            );
        return http.build();
    }
}

이 경우, .redirectionEndpoint().baseUri("/login/oauth2/callback/*") 부분에 사용하고 싶은 URI 패턴을 명시하면 됩니다. 위의 예제 코드에서는 /login/oauth2/callback/*를 사용하고 있지만, 김심바님의 경우엔 /oauth2/okta/sign-in으로 변경하시면 됩니다.

추가적으로 spring.security.oauth2.client.registration.okta.redirect-uri 속성을 통해서도 리다이렉트 URI를 설정할 수 있습니다만, 위에 언급한 SecurityFilterChain 설정도 함께 고려해보시면 좋을 것 같습니다.

보다 상세한 정보는 스프링 부트 공식 문서의 “Spring Boot Reference Documentation > 8. Web > 8.4. Spring Security > 8.4.3. OAuth2 > Client” 부분을 참조하시면 도움이 됩니다. 공식 문서의 링크는 다음과 같습니다: Spring Boot Reference Documentation OAuth2 Client

도움이 되길 바라며, 추가적인 질문이 있으시면 언제든지 문의해주세요!