Hello, Freakin world!

[Spring Cloud Config] 대칭키로 구성 정보 암호화하기 - 1 본문

Spring Cloud/Config

[Spring Cloud Config] 대칭키로 구성 정보 암호화하기 - 1

johnna_endure 2021. 2. 14. 18:30

아래 예제는 Spring Cloud Config 카테고리의 이전 글들의 예제 구조를 따라갑니다.

javachoi.tistory.com/390

 

[Spring Cloud Config] 1.컨피그 서버 만들기

대략적인 동작 방식 서비스 A의 소스를 그레이들이나 메이븐으로 빌드할 경우 jar 형식의 아티팩트가 만들어집니다. 서비스 A의 구성 정보에는 config 서버의 url 정보가 있습니다. jar가 실행될 때 S

javachoi.tistory.com


스프링 클라우드는 비대칭키,대칭키 각각 암호화/복호화 방식을 지원한다.

 

보안 측면에선 비대칭키 방식이 더 안전하다. 대칭키 방식은 암호화/복호화에 같은 키가 사용되므로 키가 유출됐을 때의 위험이 크다는 단점이 있다. 하지만 구현에 있어서는 엄청나게 단순하므로 한번 살펴보고 가자.

 

컨피그서버에 연결된 깃헙 리포지토리에 다음과 같은 yml 파일을 저장하려고 한다고 하자.

 

webclient.yml (서비스명은 이전 글에서의 webclient를 그대로 사용)

msg: "hello, world!"
password: "hello"

 

하지만 보안상 깃허브에 위 파일을 바로 푸시할 수 없고,  hello를 Spring Cloud Config에서 제공하는 방식으로 암호화한 다음 저장하자.


먼저 대칭키를 설정하자. 방식은 두 가지다.

 

1. 컨피그 서버의 application.yml or properties 파일에 encrypt.key=(대칭키) 로 설정하는 방법

2. 시스템 환경 변수에 ENCRYPT_KEY=(대칭키) 로 설정하는 방법

 

1번은 깃헙에 대칭키가 올라간다는 문제가 또 발생하므로 2번 방법을 선택.

 

인텔리제이를 사용한다면 Edit Configurations 탭을 이용해 간단하게 환경 변수를 추가할 수 있다.

 


대칭키를 설정했다면 컨피그 서버에서 자동으로 제공하는 /encrypt, /decrypt 이용해 값을 암호화/복호화 할 수 있다.

 

아래는 hello를 암호화하기 위해 POST /encrypt 엔드포인트를 이용하는 모습~

POST MAN을 이용했다.


다시 /decrypt 를 이용해 값을 확인해보자.

 

잘 동작하는군~


 

webclient.yml을 다음과 같이 수정하고 깃허브에 푸시하면 된다.

msg: "hello, world!"
password: '{cipher}00fe614f1a973f692391cdac8bc32f1066374fa064239e35b83d1f0d736ed5cc'

 

참고로 암호화한 값에는 {cipher}라는 접두어를 붙여 표시해줘야 된다.

그리고 yml 파일에는 '(작은 따옴표) 사이에 값을 넣어줘야 하고 properties 파일에는 ' 없이 입력한다.

 


자~ 컨피그 서버의 /webclient/default 엔드포인트를 이용해 값들이 제대로 올라갔는지 확인해볼까?

 

password가 추가되긴 했지만..???

password 프로퍼티가 추가되긴 했지만 비밀번호가 그대로 노출되고 있다.

혹시나하고 깃허브 저장소를 살펴보면 분명히 값은 {cipher}... 로 잘 저장돼있는데???

 

이유는 Spring Cloud Config에서 암호화된 값을 자동으로 복호화시켜서 응답을 반환하기 때문이다.

 

컨피그 서버의 application.yml을 아래와 같이 수정

server:
  port: 8888

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/johnna-endure/config_exam
          search-paths: webclient
        encrypt:
          enabled: false

 

spring.cloud.config.server.encrypt.enabled=false가 추가된 걸 볼 수 있다.

 


자~ 다시 확인해보면...

 

암호화된 비밀번호를 확인할 수 있다.

 

이까지가 대칭키를 이용한 암호화를 위해 컨피그 서버에 해줘야 할 것들이다.

 

이제 webclient 서비스 부트스트래핑 시에 암호화된 값을 주입받고 복호화해서 사용하기만 하면 된다.

이는 다음 2편에서 살펴봅시다~

 

Comments