정리정리

org.springframework.cloud VS io.awspring.cloud 본문

Spring

org.springframework.cloud VS io.awspring.cloud

wlsh 2023. 4. 17. 10:18

최근에 S3를 이용한 프로젝트를 하기 위해 Spring Cloud AWS Starter 의존성을 추가하다가 알게 된 점에 대해 정리하고자 합니다.

문제 상황

NCP의 Object Storage를 S3로 사용하기 위해 방법을 찾아보다가, 단순 AWS용 sdk를 추가하는 게 아닌 스프링에서 제공하는 AWS 의존성에 대해 알게 되었고, 이를 적용하고자 다음과 같은 의존성을 추가했었습니다.

implementation 'org.springframework.cloud:spring-cloud-starter-aws'

그런데 의존성을 추가해도 S3 연결에 필요한 AmazonS3Client 객체를 import 할 수 없었고, External Libraries를 살펴봐도 aws에 관한 sdk가 추가되지 않았었습니다.

그래서 이에 대해 검색을 해보니, 더이상 Spring Cloud AWS가 Spring Cloud의 일부가 아니라는 글을 보게 되었습니다.

새로운 Spring Cloud AWS

Spring Cloud AWS and Spring Cloud GCP are no longer part of the release train. They will continue to be part of Hoxton as long as it is supported -- at least thru June of 2021. Spring Cloud GCP will continue on as a separate project in 
https://github.com/GoogleCloudPlatform
원본

2020년 4월에 Spring Cloud m1 Release 발표하면서 공식 블로그에서 Spring Cloud AWS와 Spring Cloud GCP가 더 이상 Spring Cloud의 일부가 아니라고 발표한 부분입니다.

We picked awspring as the top level name and io.awspring.cloud as a top level package for Spring Cloud AWS, which leaves us opportunity to create other Spring-related and AWS-related, but not necessarily Spring Cloud-related, packages.
원본

그리고 2021년 3월에 패키지를 io.awspring.cloud로 하는 새로운 Spring Cloud AWS Maven Repository를 발표했습니다. 그렇기 때문에 스프링 부트를 통한 Spring Cloud AWS의 의존성 추가가 되지 않았다고 판단이 됩니다.

아무튼, 이제 새로운 Spring Cloud AWS를 사용하기 위해서는 다음과 같은 의존성을 추가하시면 됩니다.

implementation 'io.awspring.cloud:spring-cloud-starter-aws:2.4.4'

이제는 스프링 부트에 의해 의존성 버전이 관리되지 않기 때문에, 의존성 추가를 할 때 버전을 붙여줘야 한다는 점을 주의하셔야 합니다.

org.springframework.cloud VS io.awspring.cloud

사용법

따로 패키지의 변화가 있는 것은 아닌 것 같지만, 위에서 언급한 것처럼 스프링 부트에 의해 관리되지 않기 때문에 이전처럼 자동으로 AmazonS3Client가 빈으로 등록되지 않습니다. 그렇기 때문에 따로 설정 클래스를 만들어 빈으로 등록해야 합니다.

@Configuration
public class S3Config {

    @Value("${cloud.aws.credentials.accessKey}")
    private String accessKey;

    @Value("${cloud.aws.credentials.secretKey}")
    private String secretKey;
    
    @Value("${cloud.aws.s3.region}")
    private String region;

	//따로 Bean으로 등록을 해줘야 함
    @Bean
    public AmazonS3 s3Client() {
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(region)
                .build();
    }
}

사실 더이상 properties의 키 이름을 cloud.aws로 할 필요도 없는 것 같지만 아직 많은 레퍼런스나 코드들이 이렇게 작성이 되어 있어서 바꾸지 않았습니다.

스프링 부트 2와 3에서 사용 방법이 조금 다른 것 같아 따로 포스팅을 했습니다.

취약점

우선 기존의 Spring Cloud AWS는 2021년 2월을 마지막으로 업데이트가 되지 않고 있는 것을 볼 수 있습니다.

반면에 새로운 Spring Cloud AWS는 글을 작성하는 2023년 4월 기준으로 두 달 전까지도 지속해서 유지보수가 되고 있습니다.

그리고 중요한 점은 org.springframework.cloud의 가장 최신 버전인 org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE에서 업데이트가 끊긴 이후로, 2022년 8월에 해당 라이브러리가 사용하고 있는 AWS sdk에서 CVE-2022-31159 취약점이 발견되었습니다. 자세히는 모르겠지만 대충 버킷 접근 키의 유효성 검사를 우회할 수 있는 메서드가 존재한다고 합니다. 해당 취약점은 AWS sdk 1.12.260까지의 모든 버전에서 발생하고 있으며, org.springframework.cloud는 1.11.792 버전을 사용하고 있기 때문에 io.awspring.cloud를 사용하지 않을 이유가 없을 것 같습니다.

org.springframework.cloud의 최신 버전에서 aws-sdk-java 1.11.792를 사용하고 있는 모습

참고

https://stackoverflow.com/questions/73013519/org-springframework-cloud-vs-io-awspring-cloud

https://spring.io/blog/2021/03/17/spring-cloud-aws-2-3-is-now-available#why-has-the-package-name-changed

https://spring.io/blog/2020/04/17/spring-cloud-2020-0-0-m1-released

https://www.kua.kr/183

https://nvd.nist.gov/vuln/detail/CVE-2022-31159

https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-aws/2.2.6.RELEASE

https://mvnrepository.com/artifact/io.awspring.cloud/spring-cloud-starter-aws

Comments