🦴 Encryption 과 Decryption ( 대칭키와 비대칭키 )
- Encryption : 일반적인 데이터를 암호화하여 사람이 알아볼 수 없도록 변경하는 작업
- Decryption : Encryption 데이터를 원래 데이터로 변경하는 작업 ( 복호화 )
Encryption types
- Symmetric Encryption ( 대칭 암호화 방식 )
- 암호화에 사용된 키와 복호화에 사용한 키가 동일한 것
- Asymmetric Encryption ( 비대칭 암호화 방식 )
- 암호화를 할 떄 사용하는 키가 private key 와 public key 로 나뉘어있다
- 암호화할때 한개를 사용하면 복호화할땐 다른 것을 사용해야한다.
- Java 에서는 내장되어 있는 Java keytool 을 사용해서 우리가 원하는 key 값을 생성할 수 있다.
- 사진에서 보이는 것처럼 우리는 key 값을 yml 파일에 평문 그대로 저장하는 것처럼 추후에 데이터베이스에 관련되거나 IP주소와 같이 보안이 중요한 데이터는 암호화 되어 저장되어야 한다. 또한 저장된 암호화된 데이터를 다시 서비스에 전달하여 사용할 땐 암호화된 내용을 복호화하여 해당 데이터를 정확히 전달해야 한다.
🦴 암호화 & 복호화 작업
대칭키
● Config 설정
BootStrap.yml 설정
encrypt:
key: abcdefghijklmnopqrstuvwxyz0123456789
- 대칭키이기 떄문에 암호화와 복호화에 필요한 key 값은 이것 하나이다.
Test
- 요청 사항을 잘 보면 왼쪽은 암호화 오른쪽은 복호화의 모습을 볼 수 있다. 원하는 문구를 입력하면 우리가 설정한 키를 사용해 랜덤한 키를 만들어 sa 라는 문구를 저장하고 저장된 키를 사용해 복호화를 진행하면 해당 글이 뭔지 알 수 있다.
● UserSerivece설정
- config의 설정이 정상 작동하는 것을 확인했으니 이제 해당 암호화를 이용해 서비스에 데이터를 전달하는 방법을 알아보자
application.yml 설정
- 기존의 userService 에 등록되어 있는 datasource 의 값을 config 가 설정하는 yml 파일로 바꾼것을 확인 할 수 있다.
- 현재 비밀번호가 노출되어 굉장히 위험하다 비밀번호를 암호화하여 저장해볼 것이다.
bootstrap.yml 설정
- config의 설정 파일이 user-service에서 데이터를 가져오는 것으로 변경 할 예정이기에 name 을 바꿔주어야 한다
● TEST
test 전 체크 내용
- test 를 진행하기 전에 우리가 비밀번호를 1234로 하겠다고 생각했기 때문에 1234를 암호화를 하여 임의의 키값을 받고 해당 키값을 user-service.yml 파일에 저장한다.
- 이떄 주의할 점!! ▶ 암호화된 내용을 저장한다는 뜻으로 '{ciper} 암호화된 키값' 이라고 저장되어 있어야 한다.
test 시작
- 완료가 되었다면 service와 관련된 내용을 전부 기동시키고 http://127.0.0.1:8888/user-service/default 라는 uri로 요청을 하면 현재 비밀번호가 암호화가 아닌 복호화가 진행된 상태로 보여질 수 있다는 것을 확인 할 수 있다.
- 주의 사항
1. 암호화한 키값에 다른 값을 추가한다면 비밀번호가 알수없는 값(<n/a>)으로 나타난다.
2. {cipher} 를 붙이지 않는다면 그냥 암호화된 문구 그대로 나타난다.
userService의 h2 DB 확인
- eureka 를 통해 h2 DB로 들어가지는지도 확인을 해봐야한다.
- 들어갈때에는 암호화된 내용이 아닌 평문인 1234 를 입력하면 yml 파일에 등록된 암호화된 데이터가 복호화되어 들어가지는 것을 확인 할 수 있다.
비대칭키
키를 생성하기 전 폴더 생성
- JDK keytool 을 사용하기 때문에 폴더를 하나 생성해주고 해당 폴더에 키를 생성해야한다.
키 생성 - private
- 키는 public 과 private 둘 다 상관없는데 관습적으로 암호화에서는 private를 사용한다
키를 생성하기 위한 명령어
keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=latewalk, OU=API Development, O=study.co.kr, L=Seoul, C=KR" -keypass "test1234" -keystore apiEncryptionKey.jks -storepass "test1234"
- alias 를 통해서 호출하고 사용한다
- dname을 통해서 서명 정보를 추가하고 부가 정보를 입력한다.
- RSA 알고리즘을 사용하는 것을 볼 수 있다
원하는 폴더에 정상적으로 jks 라는 키가 생긴것을 볼 수 있다.
키 생성 - public
- 복호화를 위해 private key로부터 공개키를 꺼내올 수 있다.
- 첫번째 명령어는 public key 를 생성하는 명령어이다. 비밀번호는 입력해둔 것으로 작성하고 trustServer.cer라는 이름의 파일로 제작이 되어야 한다.
- 두번째는 파일이 정상적으로 제작되었는지 확인한다
- 만들어진 파일을 cer 에서 jks 로 바꿔서 키를 만들수 있다
keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks
- 이 내용을 작성하고 비밀번호를 입력한 후에 yes를 작성해주면 파일이 생성된것을 확인할 수 있다.
- 그럼 이제 private 와 public 이 모두 만들어 진것을 확인 할 수 있다.
Config 의 bootstrap 에 설정하기
- 폴더에 위치한 jks를 사용하기 위해 config의 bootstrap의 설정을 변경해주어야 한다.
encrypt:
key-store:
location: file:///C:\key-pair\apiEncryptionKey.jks
password: test1234
alias: apiEncryptionKey
- 파일의 위치 password 그리고 설정시 작성한 alias 까지 작성해주면 된다.
TEST
1. Config 만을 이용해서 키사용 여부 확인하기
- config의 설정만 변경하고 jks로 변경된 키값을 사용해 암호화를 진행하면 더욱 복잡한 키가 전달된것을 확인 할 수 있다 또한 복호화 역시 해당 값으로 잘 전달 되는 것을 확인할 수 있다
2. Service에 도입해서 확인하기
- 우리는 기존에 1234라는 password를 사용하기로 했었다 때문에 1234를 암호화하여 해당 내용을 yml에 복사붙여넣기 하여 적용하고 확인해보면 웹 서비스를 통해 복호화되어 키값이 잘보인다는 것을 확인 할 수 있다.
3. Gateway 에 도입해서 확인하기
- gateway는 bootstrap에 ecommerce를 등록 해 놓았기 때문에 해당 파일을 변경해 주어야 한다.
- config의 암호화를 이용해서 ecommerce의 값을 변경해주고 token 값에 변경된 값을 똑같이 넣어준다.
- 그리고 웹에 요청을 하면 토큰의 값이 ecommerce라고 변경되어 있는 것을 볼 수 있다.
👀 토큰은 어디에 두어야 할까
API와 UserService는 config에서 가져오려는 파일이 각자 다르다는 것을 알 수 있다. 때문에 설정을 변경해주다가 자칫 잘못하여 토큰값이 변경된다면 꽤나 골치가 아프다. 때문에 더욱 상위 개념으로 토큰 값을 저장해주는 것이 좋다.
현재 저장된 이름들은 application-name.yml파일인 것을 확인 할 수 있다. 하지만 이보다 상위 개념인 application.yml 파일에 공통적으로 사용되는 토큰값을 저장해준다면 파일 이름을 변경하거나 설정파일을 건들이다 나오는 실수때문에 토큰이 꼬이지 않을 것이다.
'MSA > MSA 강좌 - 이도원 강사님' 카테고리의 다른 글
👨👧👦10. 데이터 동기화를 위한 Apache Kafka활용하기 (1) (0) | 2024.04.09 |
---|---|
👨👧👦9. Microservice간의 통신 (RestTemplate & FeignClient) (0) | 2024.04.04 |
👨👧👦6. Spring Cloud Config (0) | 2024.04.01 |
👨👧👦5. User Microservice 와 API Gateway - Security와 Filter 적용 (0) | 2024.03.30 |
👨👧👦 4. User & Catalogs & Orders Microservice (0) | 2024.03.29 |