개발에 AtoZ까지

[Spring] Security 7로 올리면 컴파일부터 깨집니다 — 6.x에서 미리 지울 코드 본문

백엔드/Spring

[Spring] Security 7로 올리면 컴파일부터 깨집니다 — 6.x에서 미리 지울 코드

AtoZ 개발자 2026. 9. 1. 19:20
반응형

Spring Boot 4로 올려 보려고 버전만 바꿨다가 보안 설정 클래스에서 빨간 줄이 쏟아진 경험, 한 번쯤 있으실 겁니다. and()가 없다고 하고, authorizeRequests()도 못 찾겠다고 합니다.

Spring Security 7은 선택 사항이 아닙니다. Spring Boot 4로 올리면 Security 7이 따라옵니다. 그런데 7.0은 기능을 추가한 릴리스라기보다 6.x에서 경고만 띄우던 것들을 실제로 삭제한 릴리스에 가깝습니다. 그래서 경고를 무시해 온 프로젝트일수록 업그레이드 당일에 할 일이 많아집니다.

이 글을 다 읽으면 세 가지를 정할 수 있습니다. 첫째, 우리 코드에서 7.0에 못 넘어가는 부분을 목록으로 뽑을 수 있습니다. 둘째, Boot 4로 올리기 전에 6.x 상태에서 미리 고쳐 둘 순서를 잡을 수 있습니다. 셋째, 지금 옮기면 안 되는 조건에 우리가 걸리는지 판단할 수 있습니다.

이 글은 직접 프로덕션 마이그레이션을 한 기록이 아니라 Spring Security 공식 레퍼런스와 마이그레이션 문서를 확인해 정리한 것입니다(확인일 2026-08-30). 실제 적용 전에는 본인 프로젝트의 타깃 버전 릴리스 노트로 다시 확인해 주세요.

Spring Security 7.0에서 삭제된 API와 대체 API

7.0에서 실제로 사라진 것들

공식 "What's New" 문서가 제거 목록을 명시하고 있습니다. 자주 쓰이던 것부터 보면 이렇습니다.

6.x에서 쓰던 것 7.0
and() (HttpSecurity DSL 체이닝) 삭제 — 람다로 작성
authorizeRequests() 삭제 — authorizeHttpRequests()
AntPathRequestMatcher 삭제 — PathPatternRequestMatcher
MvcRequestMatcher 삭제 — PathPatternRequestMatcher
apply() (커스텀 DSL) 삭제 — with()
AuthorizationManager#check 삭제 — AuthorizationManager#authorize
OpenSAML 4 지원 삭제 — OpenSAML 5
OAuth 2.0 password grant 삭제
ApacheDsContainer (LDAP) 삭제 — UnboundID

여기서 컴파일이 깨지는 것과 런타임에 터지는 것을 나눠 봐야 합니다. 위 표의 대부분은 컴파일 단계에서 잡힙니다. 반면 경로 매칭 방식 변경은 컴파일은 통과하고 동작만 달라질 수 있어 더 위험합니다.

람다 DSL은 이제 유일한 문법입니다

6.x 문서에도 이미 적혀 있던 문장입니다.

"The Lambda DSL is the preferred way to configure Spring Security, the prior configuration style will not be valid in Spring Security 7 where the usage of the Lambda DSL will be required."

권장이 아니라 필수가 됐습니다. 예전 방식은 이렇게 생겼죠.

// 6.x 이전 스타일 — 7.0에서 컴파일 실패
http
    .authorizeHttpRequests()
        .requestMatchers("/blog/**").permitAll()
        .anyRequest().authenticated()
        .and()
    .formLogin()
        .loginPage("/login")
        .permitAll()
        .and()
    .rememberMe();

7.0에서는 이렇게 바꿉니다.

http
    .authorizeHttpRequests(authorize -> authorize
        .requestMatchers("/blog/**").permitAll()
        .anyRequest().authenticated()
    )
    .formLogin(formLogin -> formLogin
        .loginPage("/login")
        .permitAll()
    )
    .rememberMe(Customizer.withDefaults());

and()가 사라진 이유가 람다 안에서는 HttpSecurity가 자동으로 반환되기 때문입니다. 체이닝을 위해 붙이던 접착제가 필요 없어진 것이죠.

설정이 없는 기능을 켤 때는 Customizer.withDefaults()를 씁니다. 예전에 .rememberMe()만 쓰고 .and()로 넘어가던 자리입니다.

커스텀 DSL을 붙여 쓰던 프로젝트라면 여기도 바뀝니다.

// 6.2부터 deprecated
http.apply(myCustomDsl());

// 7.0
http.with(myCustomDsl(), customDsl -> {});

경로 매칭이 조용히 달라지는 부분

가장 주의할 곳입니다. 공식 마이그레이션 문서가 이렇게 적고 있습니다.

"In Spring Security 7, AntPathRequestMatcher and MvcRequestMatcher are no longer supported and the Java DSL requires that all URIs be absolute (less any context root)."

두 가지가 한꺼번에 바뀝니다. 하나는 매처 구현이 PathPatternRequestMatcher로 통일된다는 것, 다른 하나는 DSL에 주는 경로가 컨텍스트 경로를 뺀 절대 경로여야 한다는 것입니다.

서블릿 경로 접두어를 쓰는 프로젝트라면 빌더를 따로 만들어 씁니다.

PathPatternRequestMatcher.Builder servlet =
        PathPatternRequestMatcher.withDefaults().basePath("/mvc");

http.authorizeHttpRequests(authorize -> authorize
    .requestMatchers(servlet.matcher("/orders/**")).hasRole("ADMIN")
    .anyRequest().authenticated()
);

기본 서블릿에 매핑된 경로라면 PathPatternRequestMatcher.withDefaults()만 쓰면 됩니다.

Spring Security 마이그레이션 문서 — 7에서는 절대 경로만 허용됩니다 (확인일 2026-08-30)

여기서 실제로 사고가 납니다. /** 같은 넓은 패턴은 어느 매처를 쓰든 똑같이 동작해서 문제가 안 보입니다. 그런데 **/admin/**처럼 앞이 열린 패턴이나, 컨텍스트 경로를 포함해 적어 둔 경로는 결과가 달라질 수 있습니다. 권한 규칙이 헐거워지는 방향으로 틀어지면 테스트를 안 짠 구간은 배포 후에야 드러납니다.

Boot 4로 올리기 전에 6.x에서 할 수 있는 것

이게 이 글에서 제일 실용적인 부분입니다. 7.0으로 넘어가기 전에 6.x 상태에서 미리 정리해 두면 업그레이드 당일 작업이 크게 줄어듭니다.

순서는 이렇게 잡으시면 됩니다.

1. 컴파일 경고를 전부 켠다 (deprecation 경고를 빌드 실패로 승격해도 좋습니다)
2. and() 체이닝을 람다 DSL로 전부 바꾼다 → 6.x에서도 동작합니다
3. authorizeRequests() 를 authorizeHttpRequests() 로 바꾼다
4. apply() 를 with() 로 바꾼다
5. 경로 매처를 PathPatternRequestMatcher 로 미리 전환한다
6. 인가 규칙 단위 테스트를 채운다 (경로별 200/403 검증)
7. 그 다음에 Boot 4 / Security 7 로 올린다

5번은 6.x에서도 미리 켤 수 있습니다. PathPatternRequestMatcherBuilderFactoryBean을 빈으로 등록하면 DSL이 만드는 매처를 전부 PathPatternRequestMatcher로 바꿔 줍니다. 버전을 올리기 전에 새 매칭 방식으로 먼저 돌려 보고 회귀를 잡아내는 용도입니다.

6번을 굵게 강조하고 싶습니다. 경로 매칭 변경은 컴파일러가 안 잡아 주는 유일한 항목이라, 사람이 만든 안전망이 없으면 확인할 방법이 없습니다.

6.x에서 먼저 정리하고 버전을 올리는 순서

지금 옮기면 안 되는 경우

세 가지 조건 중 하나라도 걸리면 일정을 다시 잡는 편이 낫습니다.

OpenSAML 4에 묶여 있는 경우. 7.0은 OpenSAML 4 지원을 삭제했습니다. SAML 로그인을 쓰고 있다면 라이브러리 교체가 먼저입니다. AssertingPartyDetails 기반 API도 AssertingPartyMetadata 인터페이스로 바뀌었습니다.

OAuth 2.0 password grant를 쓰는 경우. 7.0에서 삭제됐습니다. 이 방식은 이미 오래전부터 권장되지 않았지만, 사내 레거시 클라이언트가 아직 쓰고 있다면 인증 흐름 자체를 바꿔야 합니다. 라이브러리 버전만 올려서 될 일이 아닙니다.

LDAP 내장 서버로 테스트하는 경우. ApacheDsContainer가 사라져 UnboundID로 옮겨야 합니다. 프로덕션이 아니라 테스트 코드가 먼저 깨집니다.

반대로 이미 6.x에서 람다 DSL과 authorizeHttpRequests를 쓰고 있고, 경로 패턴이 단순하며, SAML·password grant를 안 쓰는 프로젝트라면 7.0 전환은 하루 안에 끝나는 작업입니다. 대부분의 일반적인 웹 API 서버가 여기에 해당합니다.

새로 생긴 것 중 챙길 만한 것

제거만 있는 건 아닙니다. 실무에서 바로 쓸 만한 것 몇 가지가 들어왔습니다.

  • SPA용 CSRF 설정이 한 줄로 정리됐습니다. http.csrf(csrf -> csrf.spa()) 형태입니다. 프런트가 분리된 구조에서 매번 손으로 짜던 설정입니다.
  • 다중 인증(MFA) 지원이 들어왔습니다.
  • Spring Authorization Server가 본체에 통합됐습니다. 별도 프로젝트로 버전을 맞추던 부담이 줄어듭니다.
  • Password4j 기반 인코더(Argon2·BCrypt·SCrypt·PBKDF2 등)가 추가됐습니다.
  • OAuth 2.0 인가 서버에서 PKCE가 기본 활성화됐습니다.

버전 이야기도 하나 덧붙이면, 7.0은 2025년 11월에 GA가 나왔고 지금은 7.1 계열이 최신 안정 버전입니다. 새로 시작한다면 7.0.x가 아니라 최신 7.1.x를 보시는 편이 낫습니다.

업그레이드 전 확인 목록

[ ] 빌드 로그에서 Security 관련 deprecation 경고를 전부 수집했는가
[ ] and() 체이닝이 남아 있는 설정 클래스가 있는가
[ ] authorizeRequests() / apply() / AuthorizationManager#check 사용처를 찾았는가
[ ] 경로 패턴에 컨텍스트 경로가 포함돼 있지는 않은가
[ ] antMatchers 시절의 상대 경로·앞이 열린 패턴이 남아 있는가
[ ] 경로별 인가 규칙에 대한 통합 테스트가 있는가 (200/403)
[ ] SAML을 쓴다면 OpenSAML 5로 올릴 수 있는가
[ ] OAuth2 password grant 클라이언트가 남아 있는가
[ ] 테스트에서 ApacheDsContainer(LDAP)를 쓰는가
[ ] Java 17 이상인가 (Boot 4 최소 요구 버전)

다음에 볼 글

Security 7은 혼자 오지 않습니다. Spring Boot 4로 올릴 때 함께 결정해야 할 것들은 Spring Boot 3의 OSS 지원 종료와 4.0·4.1 선택에 정리해 뒀고, 최소 자바 버전 때문에 고민이라면 Java 21에 남을지 25로 갈지가 짝이 되는 글입니다. HTTP 클라이언트도 같은 시기에 함께 바뀝니다 — RestTemplate에서 RestClient로에 정리해 뒀습니다.

이 글은 Spring Security 공식 레퍼런스와 마이그레이션 문서에 공개된 내용을 기준으로 정리했습니다(확인일 2026-08-30). 실제 업그레이드 전에는 본인 프로젝트가 쓰는 정확한 버전의 릴리스 노트를 다시 확인해 주세요. 잘못된 내용이나 보충이 필요한 부분이 있으면 댓글로 알려 주시면 반영하겠습니다.

참고한 자료

  • Spring Security Reference — What's New in Spring Security 7.0 (확인일 2026-08-30)
  • Spring Security Reference — Configuration Migrations, Lambda DSL 필수화와 apply() → with() (확인일 2026-08-30)
  • Spring Security Reference — Web Migrations, PathPatternRequestMatcher와 절대 경로 요구 (확인일 2026-08-30)
  • Spring Security API 문서 — PathPatternRequestMatcher (확인일 2026-08-30)
  • Spring Boot 4.0 릴리스 정보 — 최소 Java 17, Java 25 지원 (확인일 2026-08-30)
반응형
Comments