지금까지 설정 정보를 따로 관리하는 것까진 했다. 하지만 설정 정보를 저장할 때 plaintext, 즉 그냥 텍스트로 저장하면 위험하다. 암호화된 설정 정보를 저장해놓고, 실제 사용할 때는 복호화해서 사용하자.
설정 정보를 암호화할 때는 대칭키 혹은 비대칭키를 사용한다.
그 중 비대칭키는 RSA 를 사용하며, Java의 keytool을 사용하면 된다.
대칭키
config-service에 bootstrap 의존성 추가
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
config-service를 실행하고 encrypt 요청을 보내면 다음과 같이 암호화된다.
decrypt 요청을 보내면 다음과 같이 복호화된다.
이제 user-service의 설정 정보를 파일에 저장하고 config-service를 통해 불러와 보자.
user-service에서 datasource 에 관련된 부분을 주석처리하고 이걸 user-service.yml 파일에 옮긴다.
이 때 비밀번호는 암호화된 값을 사용하고 이를 명시해주기 위해 {cipher} 을 사용한다.
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb
username: sa
password: "{cipher}8ff944bfc86a5130b8fc8c4888bbdb650c47fa568c6381843bceee7a3697f77b"
user-service.yml 파일을 사용하기 위해 user-service의 bootstrap.yml 파일을 다음과 같이 수정한다.
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: user-service
모든 서비스를 실행하고 확인하기 위해 config-service에 다음과 같은 요청을 보낸다.
1234라는 비밀번호가 잘 나온다. 즉, 파일에 저장되어 있던 암호문이 config-server 로 넘어오면서 복호화한 것이다.
마찬가지로 이 비밀번호로 h2-console 도 잘 들어가지는지 확인해본다.
비밀번호를 제대로 입력했다면 연결이 성공적으로 이루어진다.
--> JDBC URL 설정 catalog, order 서비스도 바꿔주자
비대칭키
비대칭키를 이용하기 위해서 JDK keytool 을 이용한다.
비밀키를 만들고, 이 파일을 config-server에 명시해야 한다.
원하는 keytool 폴더를 생성하고 다음과 같은 명령어를 사용해 개인키를 생성한다.
keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=seungmi, OU=API Development, O=seungmi.co.kr, L=Seoul, C=KR" -keypass "test1234" -keystore apiEncryptionKey.jks -storepass "test1234"
파일을 확인하기 위한 명령어는 다음과 같이 입력한다.
keytool -list -keystore apiEncryptionKey.jks -v
파일을 확인하면 Entry type: PrivateKeyEntry 정보가 확인된다. 비밀키라는 뜻이며 경우에 따라 공개키가 필요할 수도 있다.
keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file trustServer.cer
비밀키에 대한 인증서를 만든다는 소리다. rfc는 request for comment이며 표준 문서 형식이다. trustServer.cer는 인증서라고 생각하면 된다.
keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks
publicKey.jks 가 만들어지고 이것은 공개키로 사용된다. 파일을 확인하면 Entry type: trustedCertEntry 정보를 확인할 수 있다.
config-service의 bootstrap.yml을 다음과 같이 수정한다.
encrypt:
# key: abcdefghijklmnopqrstuvwxyz0123456789
key-store:
location: file:///C:/keystore/apiEncryptionKey.jks
password: test1234
alias: apiEncryptionKey
똑같이 config-service의 encrypt와 dcrypt를 호출해보자.
h2-console의 비밀번호 키가 바뀌었기 때문에 user-service.yml을 다음과 같이 수정한다.
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb
username: sa
password: "{cipher}AQBsxyd3JiQM283oWQzwndH7kBmnhKItqZ5NM9IZoI1gIqHykr67wmTBI/+FVSvfTc8J9fDpe/AzBoH/Ejb3J2jUqlaTcdb4fsaQPfZ/AmDr3towTzyxvl3EQ5v7iQUFA/ccdAQ6Uyn8MJEZ5fD3Y9DK00HZuziTY3OjKrEmS5621lyjQQd6wU+QaFW5OVaxSDP/ypBbpSNM0m9E2vCv9ZN7n9yXPMl+zTIGjR+A2fMOCo8R+NVNgTU2QUi27mtIq9V+kf79VucrLl3G7tCB+PdxA/E2f0CGgIytVU6vOKoG3+YSfKBFcLvGhp/CO3FwLqPF+6ZCM7u0W26/LFW/WbAwxAoP338BDizHK8a7SLhXMA3WlKnkRckI4VaILLKTwRg="
token:
expiration_time: 86400000
secret: user_token_native_user_service_default
gateway:
ip: 192.168.45.171
jwt 를 만들 때 썼던 token.secret 값도 암호화해보자. apigateway-service가 사용하는 ecommerce.yml 파일을 다음과 같이 수정하고 token.secret 값을 암호화한다.
gateway-service의 bootstrap.yml 파일을 다음과 같이 수정한다.
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
# profiles:
# active: dev
application.yml에 있는 token.secret은 주석처리 해주고 user_token_native_application 를 token.secret으로 사용할 것이다.
ecommerce.yml 파일을 다음과 같이 수정한다.
token:
expiration_time: 86400000
secret: "{cipher}AQB6oaotfoFrDdJq3XbOBc2bXg2TiGQMFzV752oshfvHP3ziAaNMHC4DwArJzZM7c4LZkcifJs8LVcy1zjiBUG0S0bO3N9vYmQdl2EMSlH9VrlesW7xn2lOrWnNKNei741i2USBu9gzmAiEY5E+ZQEE8BTx9FcTc6vkDuo1ped1+mC+IExNr2FBe6b7uipx7JDvOIxvPNoQoeOZQhwNwFPurG7MkgPk5JZtCFm4H+VZTeIVHuK9tg8vItUuJbN5YF8Vio2G/pxCrEgUMCPm10laSAL6ibmzwbvkrhfJ2Pp4oLEFwbgYrwA/bXD4nL4CCIv9rYXQzE7aOPolWADZl8l2D3v7zmZ+wqjhWdOFV2UJqCG0qyv7vykRJXDM03z43QJKErzI/+vrliCnYWeltZzEz"
gateway:
ip: 192.168.45.171
이 때 user-service는 user-service.yml을 사용하고 있다. user-service와 apigateway-service는 token.secret 값이 같아야 하기 때문에 user-service.yml의 token.secret 도 위와 같이 수정해 준다. 실제 요청을 보내면 복호화된 값이 나온다.
'개발 > MSA' 카테고리의 다른 글
데이터 동기화를 위한 Apache Kafka의 활용 ① (0) | 2023.08.24 |
---|---|
마이크로서비스간 통신 (0) | 2023.08.18 |
Spring Cloud Bus (0) | 2023.08.11 |
Configuration Service (0) | 2023.08.10 |
Spring security + JWT (0) | 2023.08.04 |