스프링 시큐리티 인증과정 기록

연어는결국강으로·2023년 12월 18일
0

스프링

목록 보기
1/1

1. 구글에서 sso로그인을 한다면 일어나는 일들

Google SSO (Single Sign-On)를 사용할 때의 로그인 과정은 OpenID Connect 또는 OAuth 2.0 프로토콜을 기반으로 합니다. 사용자가 이미 Google에 로그인해 있는 상태에서 시스템에 접속하면, 다음과 같은 단계를 거쳐 자동 로그인 처리가 이루어집니다:

  1. 사용자의 요청: 사용자가 시스템에 접속을 시도합니다. 시스템은 사용자가 Google 계정을 통해 인증될 수 있도록 구성되어 있습니다.

  2. 인증 요청: 시스템은 사용자를 Google의 인증 서버로 리디렉션합니다. 이 때, 시스템은 자신을 식별하는 정보(클라이언트 ID 등)와 사용자가 요청하려는 액세스 유형(예: 프로필 정보, 이메일)을 함께 전달합니다.

  3. Google 인증: 사용자가 이미 Google에 로그인해 있다면, Google 인증 서버는 사용자의 세션을 확인하고 추가적인 로그인 절차 없이 인증을 진행합니다. 만약 사용자가 Google에 로그인하지 않은 상태라면, Google 로그인 페이지가 표시됩니다.

  4. 인증 응답: 사용자의 인증이 성공하면 Google은 인증 정보(예: ID 토큰, 액세스 토큰)를 포함한 응답을 시스템에 전달합니다. 이 응답은 보통 OAuth 2.0이나 OpenID Connect를 통해 Callback URL로 리디렉션되며, 시스템은 이 정보를 사용하여 사용자를 인식합니다.

  5. 시스템에서의 처리: 시스템은 Google로부터 받은 인증 정보를 검증하고 사용자의 신원을 확인합니다. 이 과정에서 시스템은 해당 사용자에 대한 로컬 세션을 생성할 수 있으며, 이를 통해 사용자는 시스템에 로그인한 상태가 됩니다.

  6. 사용자 인터페이스: 사용자는 이제 시스템에 로그인된 상태로, 추가적인 인증 절차 없이 시스템의 리소스에 접근할 수 있습니다.

이 과정에서 중요한 점은 사용자가 Google 계정을 통해 이미 인증되어 있으면, 시스템은 이 정보를 기반으로 사용자를 식별하고 자동으로 로그인 처리를 할 수 있다는 것입니다. 이는 편리한 사용자 경험을 제공하며, 여러 시스템 간에도 일관된 인증 메커니즘을 유지할 수 있게 합니다.

2. AuthenticationManager와 AuthenticationProvider

AuthenticationProviderauthenticate 메서드와 AuthenticationManagerauthenticate 메서드는 Spring Security에서 인증 과정을 처리하는 데 사용되지만, 역할과 사용 방식이 다릅니다.

1. AuthenticationManagerauthenticate 메서드

  • 역할: AuthenticationManager는 인증 프로세스의 중심 역할을 수행합니다. 이는 인증을 시도할 때 호출되는 주된 진입점(entry point)입니다.
  • 작동 방식: AuthenticationManagerauthenticate 메서드는 Authentication 객체를 매개변수로 받습니다. 이 객체에는 인증을 위한 정보(예: 사용자 이름과 비밀번호)가 담겨 있습니다. AuthenticationManager는 이 정보를 사용하여 사용자의 인증을 시도합니다.
  • 구현: 가장 일반적인 구현체는 ProviderManager입니다. ProviderManager는 하나 이상의 AuthenticationProvider를 관리하며, 인증을 시도할 때 이들 AuthenticationProvider 중 하나를 사용합니다.

2. AuthenticationProviderauthenticate 메서드

  • 역할: AuthenticationProvider는 인증 메커니즘의 구체적인 구현을 담당합니다. 예를 들어, 데이터베이스, LDAP, SSO 등 다양한 방식으로 사용자를 인증할 수 있는 구체적인 로직을 제공합니다.
  • 작동 방식: AuthenticationProviderauthenticate 메서드 역시 Authentication 객체를 매개변수로 받습니다. 이 메서드는 인증 과정에서 실제로 사용자의 자격 증명을 검증하는 로직을 구현합니다.
  • 다양성: 다양한 종류의 AuthenticationProvider 구현체가 존재하며, 각각 특정 인증 방식을 담당합니다 (예: DaoAuthenticationProvider는 데이터베이스 기반의 인증을 처리합니다).

상호작용

  • AuthenticationManager는 인증 요청을 받아 적절한 AuthenticationProvider에게 전달합니다. AuthenticationProvider는 자격 증명을 검증하고 인증 결과를 반환합니다. 이후 AuthenticationManager는 이 결과를 요청한 클라이언트에게 다시 전달합니다.

결론

간단히 말해, AuthenticationManager는 다양한 AuthenticationProvider들을 조정하고 관리하는 역할을 하며, AuthenticationProvider는 실제로 사용자의 자격 증명을 검증하는 구체적인 로직을 구현합니다. 이 두 구성 요소는 함께 작동하여 Spring Security에서 유연하고 확장 가능한 인증 프레임워크를 제공합니다.

3. 어떤 AuthenticationProvider가 등록되어 있는지 파악하기

네, Spring Security에서 AuthenticationManager가 어떤 AuthenticationProvider를 사용하는지 확인하는 방법은 몇 가지가 있습니다. AuthenticationManager 구성을 살펴보거나, 로깅을 사용하여 어떤 AuthenticationProvider가 호출되는지 추적하는 방법이 대표적입니다.

1. AuthenticationManager 구성 확인

  • 설정 파일 또는 Java 구성: AuthenticationManager를 구성하는 코드 또는 설정 파일을 확인하면 어떤 AuthenticationProvider들이 등록되었는지 확인할 수 있습니다. ProviderManager가 사용되는 경우, 이 객체에 등록된 AuthenticationProvider 목록을 확인할 수 있습니다.

  • Java 코드 예시:

    @Autowired
    private AuthenticationManager authenticationManager;
    
    @PostConstruct
    public void printProviders() {
        if (authenticationManager instanceof ProviderManager) {
            ProviderManager manager = (ProviderManager) authenticationManager;
            List<AuthenticationProvider> providers = manager.getProviders();
            providers.forEach(provider -> System.out.println(provider.getClass().getName()));
        }
    }

    이 코드는 ProviderManager에 등록된 모든 AuthenticationProvider들의 클래스 이름을 출력합니다.

2. 로깅

  • 로깅을 통한 추적: AuthenticationProvider 구현 내부에 로깅을 추가하여 authenticate 메서드가 호출될 때 이를 기록할 수 있습니다. 이 방법은 실제 실행 흐름에서 어떤 AuthenticationProvider가 사용되는지 확인하는 데 유용합니다.

  • Java 코드 예시:

    public class MyCustomAuthenticationProvider implements AuthenticationProvider {
        private static final Logger logger = LoggerFactory.getLogger(MyCustomAuthenticationProvider.class);
    
        @Override
        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
            logger.info("MyCustomAuthenticationProvider called");
            // 인증 로직
        }
    
        // 나머지 메서드 구현
    }

    이 코드는 MyCustomAuthenticationProviderauthenticate 메서드가 호출될 때 로그를 남깁니다.

3. 디버그 모드

  • Spring Security 디버그 모드: Spring Security의 디버그 모드를 활성화하면, 인증 프로세스에서 발생하는 다양한 이벤트를 로그로 확인할 수 있습니다. 이를 통해 어떤 AuthenticationProvider가 호출되는지 파악할 수 있습니다.
  • 설정 방법: application.properties 또는 application.yml 파일에 다음을 추가합니다.
    logging.level.org.springframework.security=DEBUG

위 방법들을 통해, AuthenticationManager가 어떤 AuthenticationProvider를 실행하는지 확인할 수 있으며, 이는 특정 인증 과정을 디버깅하거나 시스템의 동작을 이해하는 데 도움이 됩니다.

4. SSO로그인 검증 로직은 어디에 위치하는가

시스템에 진입 시 SSO(Single Sign-On) 엔드포인트로 리디렉션하는 로직의 위치는 애플리케이션의 보안 구성, 구조 및 사용되는 프레임워크에 따라 달라질 수 있습니다. 일반적으로, Spring Security를 사용하는 경우 몇 가지 전형적인 방법이 있습니다:

1. Spring Security 설정

가장 일반적인 방법은 Spring Security 설정 내에서 리디렉션을 처리하는 것입니다. HttpSecurity 설정을 사용하여 SSO 로그인 페이지로의 리디렉션을 설정할 수 있습니다. 이는 WebSecurityConfigurerAdapter를 확장한 클래스 내에서 구현됩니다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        // 기타 보안 설정
        .oauth2Login()
            .loginPage("/custom-login") // 사용자 정의 로그인 페이지 경로
            .defaultSuccessUrl("/home") // 로그인 성공 후 리디렉션 경로
            .failureUrl("/login?error") // 로그인 실패 시 리디렉션 경로
            // 기타 OAuth2 설정
        .and()
            // 기타 구성
}

이 설정에서, /custom-login 경로로 요청이 들어오면, Spring Security는 사용자를 SSO 로그인 페이지(예: Google, Facebook)로 리디렉션합니다.

2. 컨트롤러에서의 리디렉션

특정 조건이나 로직에 따라 SSO 페이지로 리디렉션해야 할 경우, 스프링 MVC 컨트롤러 내에서 리디렉션을 처리할 수 있습니다.

@Controller
public class MyController {

    @GetMapping("/custom-login")
    public String redirectToSSO() {
        // 조건 검사 또는 추가 로직
        return "redirect:[SSO 로그인 페이지 URL]";
    }
}

3. 필터 또는 인터셉터 사용

보다 복잡한 조건 또는 세밀한 제어가 필요한 경우, 스프링 필터 또는 인터셉터를 사용하여 리디렉션 로직을 구현할 수 있습니다.

4. 기타 고려사항

  • 에러 핸들링: 인증 실패 또는 다른 보안 관련 이슈를 처리하기 위한 에러 핸들링 로직을 포함하는 것이 중요합니다.
  • 사용자 경험: 사용자가 로그인 페이지로 자연스럽게 유도되도록 하는 것이 중요합니다. 갑작스러운 리디렉션이 사용자 경험을 저해하지 않도록 주의해야 합니다.

위치와 구현 방법은 애플리케이션의 요구 사항, 보안 요구, 그리고 특정 사용 사례에 따라 달라질 수 있습니다. 전반적으로, 이러한 리디렉션 로직은 사용자가 시스템에 쉽고 안전하게 접근할 수 있도록 설계되어야 합니다.

0개의 댓글