최근 Spring Boot 프로젝트를 진행하면서 OAuth2 연동을 테스트하기 위해 관련 의존성만 추가했습니다.
그런데, 로그인 화면을 따로 만들지도 않았고, Spring Security 설정도 하지 않았는데, localhost:8080에 접속하자 기본 로그인 화면이 나타났습니다.
처음엔 당황했지만, Spring Boot 공식 문서와 의존성 구조를 살펴보며 원인을 파악했습니다. 이 글에서는 왜 이런 일이 발생했는지, 그리고 이를 해결하거나 활용하는 방법을 공유하려고 합니다.
왜 로그인 화면이 나타났을까?
프로젝트 설정
제가 추가한 의존성은 단 하나입니다:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
- Spring Security 관련 의존성을 직접 추가하지 않았습니다.
- Security 설정 클래스(WebSecurityConfigurerAdapter나 SecurityFilterChain)도 작성하지 않았습니다.
- 그럼에도 / 경로에 접속하면 Spring Security의 기본 로그인 화면이 출력됩니다.
원인: Spring Boot의 자동 구성(Auto-Configuration)
Spring Boot는 클래스패스에 특정 라이브러리가 존재하면 관련 기능을 자동으로 활성화하는 강력한 자동 구성 기능을 제공합니다. 이게 이번 현상의 핵심입니다.
1. OAuth2 Starter의 내부 구조
spring-boot-starter-oauth2-client는 내부적으로 Spring Security를 의존합니다.
Maven/Gradle의 의존성 트리를 살펴보면, 이 스타터는 spring-security-config, spring-security-web, spring-security-oauth2-client 같은 라이브러리를 자동으로 포함합니다.
# mvn dependency:tree 출력 예시
[INFO] +- org.springframework.boot:spring-boot-starter-oauth2-client:jar:3.0.5:compile
[INFO] | +- org.springframework.security:spring-security-config:jar:6.0.3:compile
[INFO] | +- org.springframework.security:spring-security-oauth2-client:jar:6.0.3:compile
[INFO] | +- org.springframework.security:spring-security-web:jar:6.0.3:compile
즉, OAuth2 의존성을 추가하는 순간 Spring Security가 프로젝트에 포함됩니다.
2. Spring Security의 기본 동작
Spring Security가 클래스패스에 존재하면, Spring Boot는 **모든 HTTP 엔드포인트에 기본 인증(Basic Authentication)**을 적용합니다.
이는 Spring Boot의 Security Auto-Configuration에 의해 자동으로 설정됩니다.
공식 문서에서 이를 명확히 설명합니다:
“If Spring Security is on the classpath, Spring Boot automatically secures all HTTP endpoints with basic authentication.”
– Spring Boot Reference Guide, Security
- 결과적으로, / 경로에 접속하면 Spring Security가 보호된 페이지로 간주하고, 인증되지 않은 사용자를 기본 로그인 페이지로 리다이렉트합니다.
- 기본 로그인 페이지는 Spring Security가 제공하는 간단한 HTML 폼입니다.
해결 방법: 로그인 화면을 원치 않을 경우
만약 이 기본 로그인 화면을 원하지 않는다면, 다음 두 가지 방법 중 하나를 선택할 수 있습니다:
1. Security Auto-Configuration 비활성화
Spring Boot의 자동 보안 설정을 완전히 끄는 방법입니다.
application.properties 또는 application.yml에 다음 설정을 추가하세요:
spring.security.enabled=false
주의: 이 설정은 Spring Security 자체를 비활성화하므로, OAuth2 클라이언트 기능도 동작하지 않을 수 있습니다. OAuth2를 사용하려면 다음 방법이 더 적합합니다.
2. Spring Security 커스터마이징
Spring Security를 비활성화하지 않고, 원하는 대로 동작하도록 설정을 커스터마이징할 수 있습니다.
예를 들어, 특정 경로(예: /, /public)는 인증 없이 접근 가능하도록 설정할 수 있습니다:
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.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/public/**").permitAll() // 인증 없이 접근 허용
.anyRequest().authenticated() // 나머지 요청은 인증 필요
)
.oauth2Login(); // OAuth2 로그인 활성화
return http.build();
}
}
- 위 코드는 /와 /public/** 경로는 누구나 접근 가능하도록 설정하고, 나머지 경로는 인증을 요구합니다.
- .oauth2Login()은 OAuth2 로그인을 활성화하여 Google, GitHub 같은 외부 제공자를 통해 로그인 가능.
부가 팁: 디버깅과 이해를 위한 도구
- 의존성 트리 확인
Maven이나 Gradle을 사용한다면, 의존성 트리를 확인해 어떤 라이브러리가 포함되었는지 파악하세요:또는 IntelliJ IDEA의 External Libraries 섹션에서 확인 가능. - mvn dependency:tree
- Spring Security와 OAuth2의 관계
OAuth2는 Spring Security 위에서 동작합니다. 따라서 spring-boot-starter-oauth2-client를 사용하면 Spring Security가 필수적으로 포함됩니다. 이를 이해하면 설정 과정이 훨씬 명확해집니다. - 로그로 디버깅
Spring Security의 동작을 확인하려면 application.properties에 로깅 설정 추가:이렇게 하면 Security 필터 체인과 인증 흐름을 디버깅할 수 있습니다. - logging.level.org.springframework.security=DEBUG
결론
Spring Boot 프로젝트에서 spring-boot-starter-oauth2-client 의존성을 추가했을 때, 별도의 설정 없이도 로그인 화면이 나타나는 이유는 Spring Security의 자동 구성 때문입니다.
- spring-boot-starter-oauth2-client가 Spring Security를 포함.
- Spring Security가 클래스패스에 있으면, 모든 엔드포인트에 기본 인증을 적용.
- 결과적으로 / 경로 접속 시 기본 로그인 페이지가 표시됨.
이를 원치 않는다면 Security 설정을 비활성화하거나, 커스텀 Security 설정을 통해 원하는 경로만 인증하도록 조정할 수 있습니다.
이 글이 Spring Boot와 OAuth2를 처음 다루는 분들에게 도움이 되길 바랍니다! 궁금한 점이 있다면 댓글로 남겨주세요.
'Spring' 카테고리의 다른 글
| [Spring] 객체지향 설계와 스프링 (0) | 2023.01.30 |
|---|---|
| [Spring] @RestController (0) | 2023.01.27 |