반응형

본 내용은 인프런의 이도원 님의 강의 "Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)" 내용을 바탕으로 정리한 내용입니다.

 

Java KeyStore(JKS)

  • 자바 애플리케이션에서 키와 인증서를 안전하게 저장하고 관리하는 저장소'
  • JKS 파일은 개인 키, 공개 키, 비밀 키, 인증서를 포함할 수 있으며, keytool 유틸리티를 사용하여 생성, 관리 및 사용하는 것이 일반적이다.

대칭 키 암호화

  • 암호화와 복호화에 동일한 키를 사용한다.
  • 일반적으로 비대칭 키 암호화보다 빠르다.
  • 키가 노출되면 암호화된 데이터가 노출될 수 있다.

대칭 키 암호화 실습

1. ConfigService

bootstrap.yml 추가

encrypt:  
  key: YourEncryptionKey123456789

UserService 수정

bootstrap.yml
spring:  
  cloud:  
    config:  
      uri: http://127.0.0.1:8888  
      name: userService  
#  profiles:  
#    active: dev

2. 설정파일 수정

userService.yml
sspring:
  datasource:
    driverClassName: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/shop_db?characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: '{cyper}3146284c596286bcc58e04a44ea6c7580c6840cee9889c638f3699dd5af4b2df'

token:
  expiration_time: 864
  secret: YourUserSuperSecretKeyForJwtHS256Algorithm

gateway:
  ip: 127.0.0.1
  • 포스트맨을 사용하여 raw에 비밀번호를 입력하고 http://127.0.0.1:8888/encrypt 를 호출해서 암호화된 비밀번호를 반환하여 password에 입력한다.
  • '{cyper}암호화된 비밀번호' 라고 표시하면 암호화된 문자라는 걸 표현할 수 있다.

결과 확인

{
  "name": "userService",
  "profiles": [
    "default"
  ],
  "label": null,
  "version": null,
  "state": null,
  "propertySources": [
    {
      "name": "file:/C:/MSA/native-file-lepo/userService.yml",
      "source": {
        "spring.datasource.driverClassName": "org.mariadb.jdbc.Driver",
        "spring.datasource.url": "jdbc:mariadb://localhost:3306/shop_db?characterEncoding=UTF-8&serverTimezone=UTC",
        "spring.datasource.username": "root",
        "spring.datasource.password": 1234,
        "token.expiration_time": 864,
        "token.secret": "YourUserSuperSecretKeyForJwtHS256Algorithm",
        "gateway.ip": "127.0.0.1"
      }
    },
    {
      "name": "file:/C:/MSA/native-file-lepo/application.yml",
      "source": {
        "token.expiration_time": 864000000,
        "token.secret": "YourSuperSecretKeyForJwtHS256Algorithm_changed_#1",
        "gateway.ip": "127.0.0.1"
      }
    }
  ]
}

비대칭키 암호화

  • 두 개의 키를 사용하는데 공개 키는 암호화에 사용되며, 개인 키는 복호화에 사용한다.
  • 공개 키를 자유롭게 배포할 수 있지만, 개인 키는 안전하게 보호해야 한다.
  • 대칭 키 암호화보다 일반적으로 느리다.

비대칭키 암호화 실습

1. keystore 파일과 인증서 생성

# 폴더 생성
mkdir C:\MSA\keystore

# Java의 `keytool`을 사용하여 RSA 키 쌍을 생성
keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=Kenneth Lee, OU=API Development, O=joneconsulting.co.kr L=Seoul, C=KR" -keypass "sjmoon1234" -keystore apiEncryptionKey.jks -storepass "sjmoon1234"

# apiEncryptionKey.jks 상세 정보 출력
keytool -list -keystore apiEncryptionKey.jks -v

# `apiEncryptionKey` 별칭을 가진 인증서를 내보내고, 이를 `trustServer.cer` 파일에 저
keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file trustServer.cer

# 인증서로 공개 keystore 파일 생성
keytool -import alias trustServer -file trustServer.cer -keystore publicKey.jks
  • dir로 해당 디렉토리를 확인하면 apiEncryptionKey.jks, publicKey.jks, trustServer.cerr가 생성된 것을 확인할 수 있다.

2. ConfigService

bootstrap.yml
encrypt:  
  key-store:  
    location: file:///C:\MSA\keystore/apiEncryptionKey.jks  
    password: sjmoon1234  
    alias: apiEncryptionKey  
#  key: YourEncryptionKey123456789

3. 설정 파일

userService.yml

spring:
  datasource:
    driverClassName: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/shop_db?characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: '{cipher}AQBwDJWPo1chyTQCyBUkW4h8MyUsvi64yGjgDjFSPUA6/Qjvy9eQJq5NqglTTiAVYdD/jpgwwExbHc/tdUjxknL3QD4Lhbb93EHPUy17Z/rbkbBkiQRMYfZsK0j9oZBvpR/GMqCR2pZXM+x4YMsp94UsBOZhCiwgvZrofEPZySAqtgsMCHA4daUm7iSKinvVQAfRKAJwZOSnka/gPhBCDThL+BptsYfAV1KvuC0pXlc0CMFFt4uihwRUfGbondRKmRjsDQMgk5cnwRkwz//mqHMCTAsLI95fzTGSE9sXzTgQiR9Vm11UercxJKLD00FHF6g4FoVwiP4b//mXNnaEudQd8gueuhY7Nd4w4JRhHq49rjliFLbQNNvagQdfYbO7ZEc='
  • 포스트맨을 사용하여 raw에 비밀번호를 입력하고 http://127.0.0.1:8888/encrypt 를 호출해서 비대칭키로 암호화된 비밀번호를 반환하고 password에 입력한다.

결과 확인

{
  "name": "userService",
  "profiles": [
    "default"
  ],
  "label": null,
  "version": null,
  "state": null,
  "propertySources": [
    {
      "name": "file:/C:/MSA/native-file-lepo/userService.yml",
      "source": {
        "spring.datasource.driverClassName": "org.mariadb.jdbc.Driver",
        "spring.datasource.url": "jdbc:mariadb://localhost:3306/shop_db?characterEncoding=UTF-8&serverTimezone=UTC",
        "spring.datasource.username": "root",
        "spring.datasource.password": 1234,
        "token.expiration_time": 864,
        "token.secret": "YourUserSuperSecretKeyForJwtHS256Algorithm",
        "gateway.ip": "127.0.0.1"
      }
    },
    {
      "name": "file:/C:/MSA/native-file-lepo/application.yml",
      "source": {
        "token.expiration_time": 864000000,
        "token.secret": "YourSuperSecretKeyForJwtHS256Algorithm_changed_#1",
        "gateway.ip": "127.0.0.1"
      }
    }
  ]
}
반응형

'Cloud > MSA' 카테고리의 다른 글

[MSA] Apache Kafka  (0) 2024.12.02
[MSA] Feign Client  (0) 2024.12.02
[MSA] Spring Cloud Bus  (0) 2024.12.02
[MSA] Spring Cloud Config  (0) 2024.12.02
[MSA] MicroService 구현(로그인)  (0) 2024.11.27

+ Recent posts