Spring Boot 3.x & Spring Security 6.x: 더 강력해진 보안, 하지만 함정은? (업그레이드 방법 포함)

Spring Boot 3.x는 최근 출시되어 많은 개발자들이 새로운 기능과 향상된 성능에 기대를 걸고 있다. Java 17 이상을 기반으로 하며, Jakarta EE 9 및 10을 지원하고 GraalVM Native Image를 통한 네이티브 이미지 생성 기능을 제공하여 더욱 빠른 시작 시간과 적은 메모리 사용량을 자랑한다. 또한 Spring Security 6.x는 OAuth 2.1 및 OpenID Connect 1.0을 완벽하게 지원하며, WebAuthn과 같은 최신 인증 기술을 도입하여 더욱 안전한 웹 애플리케이션 개발을 가능하게 한다.

하지만 Spring Boot 2.x에서 3.x로 업그레이드하는 과정은 마냥 순탄하지만은 않다. 의존성 충돌, 새로운 설정 및 API 적용 어려움, OAuth 2.1 및 WebAuthn 등 새로운 보안 기능 활용 방법에 대한 질문들이 Stack Overflow에 끊이지 않고 올라오고 있다. 특히 기존 Spring Boot 2.x 기반 애플리케이션과의 호환성 문제는 개발자들을 곤혹스럽게 만드는 주요 원인이다.

이러한 문제들을 해결하기 위해서는 Spring Boot 3.x 마이그레이션 가이드를 꼼꼼히 참고하고, 변경된 내용을 완벽하게 파악해야 한다. 또한 Spring Security 6.x 공식 문서 및 예제 코드를 학습하여 새로운 기능과 API 사용법을 익히고, 실제 프로젝트에 적용해보는 것이 중요하다. Stack Overflow 및 개발자 커뮤니티를 적극 활용하여 다른 개발자들의 경험과 지식을 공유하고, 질문을 통해 도움을 받는 것도 좋은 방법이다. 만약 당장 업그레이드가 어렵다면, Spring Boot 2.x를 유지하면서 보안 패치를 꾸준히 적용하거나, Spring Security 5.x의 보안 기능을 활용하는 것도 고려해볼 수 있다.

Spring Boot 2.x -> 3.x 업그레이드 방법

1단계: 사전 준비

  • Java 17 이상 설치: Spring Boot 3.x는 Java 17 이상을 요구하므로, Java 버전을 확인하고 필요하다면 업데이트한다.
  • Spring Boot 2.x 최신 버전 업데이트: Spring Boot 2.x의 최신 버전으로 업데이트하여 호환성 문제를 최소화한다.
  • Spring Boot 3.x 마이그레이션 가이드 정독: Spring 공식 문서에서 제공하는 마이그레이션 가이드를 꼼꼼히 읽고, 변경된 내용을 파악한다.

2단계: 의존성 업데이트

  • Spring Boot 3.x 의존성 추가: pom.xml (Maven) 또는 build.gradle (Gradle) 파일에서 Spring Boot 2.x 의존성을 제거하고, Spring Boot 3.x 의존성을 추가한다.
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
    <relativePath/> </parent>
// build.gradle
plugins {
    id 'org.springframework.boot' version '3.0.0'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}
  • Spring Boot 3.x 호환 가능한 의존성 확인: Spring Boot 3.x와 호환되지 않는 써드파티 라이브러리가 있다면, 해당 라이브러리를 업데이트하거나 대체 라이브러리를 찾아야 한다.
  • 의존성 충돌 해결: 의존성 충돌이 발생하는 경우, mvn dependency:tree (Maven) 또는 gradle dependencies (Gradle) 명령어를 사용하여 의존성 트리를 분석하고, 충돌하는 의존성을 제거하거나 버전을 조정한다.

3단계: 설정 변경

  • application.properties 또는 application.yaml 파일 수정: Spring Boot 3.x에서 변경된 설정 항목을 확인하고, 필요한 설정을 추가하거나 수정한다.
  • Deprecated된 설정 제거: Spring Boot 3.x에서 더 이상 사용되지 않는 설정 항목은 제거한다.

4단계: 코드 수정

  • Deprecated된 API 교체: Spring Boot 3.x에서 deprecated된 API를 사용하는 코드는 새로운 API로 교체한다.
  • Jakarta EE 네임스페이스 변경: javax.* 패키지에서 jakarta.* 패키지로 변경된 네임스페이스를 수정한다.
  • Spring Security 6.x API 변경: Spring Security 6.x에서 변경된 API를 사용하는 코드를 수정한다.
@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(Customizer.withDefaults());
        return http.build();
    }
}

5단계: 테스트 및 배포

  • 단위 테스트, 통합 테스트 수행: 업그레이드 후 모든 테스트가 정상적으로 통과하는지 확인한다.
  • 스테이징 환경에서 테스트: 실제 운영 환경과 유사한 스테이징 환경에서 충분히 테스트하여 문제점을 발견하고 수정한다.
  • 운영 환경 배포: 모든 테스트가 완료되면 운영 환경에 배포한다.

참고 자료: