1. 개요

이 기사에서는 Maven으로 Spring Security 를 ​​설정하는 방법을 설명 하고 Spring Security 의존성을 사용하는 특정 사용 사례를 살펴봅니다. Maven Central 에서 최신 Spring Security 릴리스를 찾을 수 있습니다 .

이것은 이전 Spring with Maven 기사 에 대한 후속 조치이므로 비Security Spring 의존성의 경우 여기서 시작해야 합니다.

2. Maven을 사용한 스프링 Security

2.1. 스프링 Security 코어

Core Spring Security 지원인 spring-security-core 에는 인증 및 액세스 제어 기능이 포함되어 있습니다. 이 의존성은 Spring Security를 ​​사용하는 모든 프로젝트에 필수로 포함해야 합니다.

또한 spring-security-core 는 독립 실행형(비웹) 애플리케이션, 메서드 수준 Security 및 JDBC를 지원합니다.

<properties>
    <spring-security.version>5.3.4.RELEASE</spring-security.version>
    <spring.version>5.2.8.RELEASE</spring.version>
</properties>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${spring-security.version}</version>
</dependency>

Spring과 Spring Security는 서로 다른 릴리스 일정있으므로 버전 번호 간에 항상 1:1 일치가 있는 것은 아닙니다.

이전 버전의 Spring으로 작업하는 경우 이해해야 할 매우 중요한 사실은 직관적이지 않게 Spring Security 4.1.x가 Spring 4.1.x 릴리스에 의존하지 않는다는 사실입니다! 예를 들어 Spring Security 4.1.0 이 릴리스되었을 때 Spring 코어 프레임워크는 이미 4.2.x에 있었고 따라서 해당 버전을 컴파일 의존성으로 포함합니다. 계획은 향후 릴리스에서 이러한 의존성을 보다 밀접하게 정렬하는 것 입니다. 자세한 내용은 이 JIRA 를 참조하십시오. 그러나 당분간은 다음에 살펴볼 실질적인 의미가 있습니다.
2.2. 스프링 Security 웹

Spring Security에 대한 웹 지원 을 추가하려면 spring-security-web 의존성 이 필요합니다 .

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring-security.version}</version>
</dependency>

여기에는 Servlet 환경에서 URL 액세스 제어를 가능하게 하는 필터 및 관련 웹 Security 인프라가 포함됩니다.

2.3. 스프링 Security 및 이전 스프링 코어 의존성 문제

이 새로운 의존성은 Maven 의존성 그래프에도 문제를 나타냅니다. 위에서 언급했듯이 Spring Security jar는 최신 Spring 코어 jar(이전 버전)에 의존하지 않습니다. 이로 인해 최신 5.x Spring 아티팩트 대신 클래스 경로 위에 이러한 이전 의존성 이 생성될 수 있습니다.

왜 이런 일이 발생하는지 이해하려면 Maven이 충돌을 해결 하는 방법을 살펴봐야 합니다. 버전이 충돌하는 경우 Maven은 트리의 루트에 가장 가까운 jar를 선택합니다. 예를 들어 spring-corespring-orm (5.0.0 .RELEASE 버전 포함) 과 spring-security-core ( 5.0.2.RELEASE 버전 포함) 모두에 의해 정의됩니다. 따라서 두 경우 모두 spring-jdbc 는 프로젝트의 루트 pom에서 깊이 1로 정의됩니다. 그 때문에 실제로 우리의 pom에서 spring-ormspring-security-core 가 어떤 순서로 정의되는지가 중요합니다. 첫 번째가 우선이므로우리는 classpath에 있는 두 버전 중 하나로 끝날 수 있습니다 .

이 문제를 해결하기 위해 우리는 자체 pom에서 일부 Spring 의존성을 명시적으로 정의 해야 하며 암시적 Maven 의존성 해결 메커니즘에 의존하지 않아야 합니다. 이렇게 하면 특정 의존성이 pom의 깊이 0(pom 자체에 정의된 대로)에 놓이게 되어 우선 순위를 갖습니다. 다음은 모두 동일한 범주에 속하며 모두 직접 또는 다중 모듈 프로젝트의 경우 부모의 dependencyManagement 요소에서 명시적으로 정의되어야 합니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring-version}</version>
</dependency>

2.4. spring-security-config 및 기타

풍부한 Spring Security XML 네임스페이스 및 어노테이션을 사용하려면 spring-security-config 의존성이 필요합니다.

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring-security.version}</version>
</dependency>

마지막으로 LDAP , ACL , CAS, OAuth OpenID 지원은 Spring Security 에 자체 의존성이 있습니다 .

3. 스프링 부트 사용

Spring Boot로 작업할 때 spring-boot-starter-security 스타터는 자동으로 spring-security-core , spring-security-webspring-security-config 와 같은 모든 의존성을 포함합니다 .

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.3.3.RELEASE</version>
</dependency>

Spring Boot는 자동으로 모든 의존성을 관리하므로 앞에서 언급한 스프링 Security 및 이전 핵심 의존성 문제도 제거됩니다.

4. 스냅샷 및 마일스톤 사용

Spring Security 이정표 및 스냅샷은 Spring에서 제공하는 사용자 지정 Maven 리포지토리에서 사용할 수 있습니다. 이를 구성하는 방법에 대한 자세한 내용은 스냅샷 및 마일스톤 사용 방법을 참조하십시오 .

5. 결론

이 빠른 사용방법(예제)에서는 Maven과 함께 Spring Security를 ​​사용하는 실제적인 세부 사항에 대해 논의했습니다 . 여기에 제시된 Maven 의존성은 물론 주요 의존성 중 일부이며 언급할 가치가 있지만 아직 잘리지 않은 몇 가지 다른 의존성이 있습니다. 그럼에도 불구하고 이것은 Maven 지원 프로젝트에서 Spring을 사용하기 위한 좋은 출발점이 되어야 합니다.

Security footer banner