ํด๋น ๊ธ์ Spring Cloud Config์ name, profiles ๊ทธ๋ฆฌ๊ณ Github ๋ฅผ ์ฐ๋ํด์ ์ค์ ํ์ผ ๊ด๋ฆฌํ๊ธฐ์ ์์กดํ๋ ๊ธ์ ๋๋ค. ์ค์ต ํ๊ฒฝ์ ๋ฐ๋ผํ์๋ ค๋ฉด ์ด์ ๊ธ์ ๋์จ ์ค์ต์ ๋ฐ๋ผํ์๊ธธ ๊ถ๊ณ ๋๋ฆฝ๋๋ค.
๋ชฉ์ฐจ
- ๊ธฐ์กด Config Server์ ๋ฌธ์ ์
- ์ํธํ๋ฅผ ํ์ง ์์ ์ ๋ณด์ ํ์ทจ ๊ฐ๋ฅ์ฑ
- ์ํธํ ์ข
๋ฅ
- ๋์นญํค
- ๋น๋์นญํค
- Spring Cloud Config ์ encrypt, decrypt
- encrypt
- decrypt
- ์ค์ตํ๊ธฐ
- ๋์นญํค ์ด์ฉํ๊ธฐ
๊ธฐ์กด Config Server์ ๋ฌธ์ ์
์ง๋ ์๊ฐ ์ฐ๋ฆฌ๋ github๋ฅผ ์ด์ฉํด์ ์๊ฒฉ ์ ์ฅ์์ ์ค์ ํ์ผ๋ค์ ์ ์ฅํด๋๊ณ Config ์๋ฒ์์ ๊ฐ์ ธ๋ค๊ฐ ๋ค๋ฅธ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ฟ๋ ค์ฃผ๋ ๊ณผ์ ์ ์์๋ณด๊ณ ์ด๋ฅผ ๊ตฌํํ์์๋ค.
์ฐ๋ฆฌ์ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ๋ก ๋ค์ ๋ค์ด๊ฐ๋ณด์.
๊ทธ๋ผ ์ด๋ ๊ฒ ํ์ผ ๋ด๋ถ์ ์๋ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋ฐ๋ก ๋ ธ์ถ๋๋ค.
๋ฌผ๋ก ํด๋น ๋ ํฌ์งํ ๋ฆฌ๋ public repository๋ผ์ ๊ทธ๋ ๋ค! ๋ผ๊ณ ํ ์ ์๊ฒ ์ง๋ง ๊ทธ๋ผ private ์ผ๋ก repository ๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ํด์ ๋ณด์ ์ํ์ด ์ฌ๋ผ์ง๋๊ฑธ๊น?
์ด๋ ๊ฒ ๋จ์ง ์จ๊ธฐ๋ ๋ฐฉ์์ ๋ณด์์ ์ ํ ์์ ํ์ง ์๋ค.
๋ณด์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ ๊ทธ ์๊ฐ ๋๋ฌธ์ ์ฌ๋๋ค์ ์์ฌ์ ํ ์ ์๋๋ฐ, ์ด๋ ์คํ๋ ค ์ด๋ฐ ์จ๊ธฐ๋ ๋ณด์์ ํ์ง ์๋ ๊ฒ ๋ณด๋ค ๋ชปํ๋ค.
๊ทธ๋ผ ์ด ๋ฌธ์ ๋ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น?
๋ฐ๋ก yml์ ๋ค์ด๊ฐ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์ํธํ ํ๋ค๋ฉด ํด๊ฒฐ๋ ๊ฒ ๊ฐ๋ค.
์ํธํ ์ข ๋ฅ
์ํธํ ์ข ๋ฅ์๋ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
- ๋์นญํค ์ํธ
- ๋น๋์นญํค ์ํธ
- ๋จ๋ฐฉํฅ ์ํธ
์ฌ๊ธฐ์ ๋จ๋ฐฉํฅ ์ํธ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅํ ๋ ํด์ฑ์ ํ์ฌ ์ํธํ๋ฅผ ํ๋ ๊ฒ์ผ๋ก ๋จ์ง ํ๋ฌธ์ ํด๋ ํ์ง ๋ชปํ๋๋กํ๋ ๊ฒ์ด๋ผ ๋ณตํธํ๊ฐ ์ฌ์ค์ ๋ถ๊ฐ๋ฅํ๋ค๋ ์ ์ผ๋ก ์ผ๋จ ์ฐ๋ฆฌ ๋ ผ์ ์์ ๋น ์ง๊ฒ ๋๊ณ ๋์นญํค์ ๋น๋์นญํค์ ๋ํด์๋ง ์ด์ผ๊ธฐ๋ฅผ ํด๋ณด์.
๋์นญํค ์ํธ
๋์นญํค ์ํธ๋ ์ํธํ ํค์ ๋ณตํธํ ํค๊ฐ ๊ฐ์ ์ ์ผ๋ก ๊ฐํธํ๋ค.
๊ฒ๋ค๊ฐ ๋๋ฆฌ ์ฐ์ด๋ AES๋ 128 ~ 256 ๋นํธ์ ํค๋ฅผ ์ ์ฉํ ์ ์์ด์ ๋ณด์์ฑ์ด ๋ฐ์ด๋จ๊ณผ ๋์์ ๊ณต๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์์ง๋ง ๊ฐ์ฅ ์น๋ช
์ ์ธ ๋จ์ ์ด ์กด์ฌํ๋ค.
๋ฐ๋ก ํค๋ฅผ ์ด๋ป๊ฒ ๋ฐฐ์กํ ๊ฒ์ธ์ง์ ๋ํ ๋ ผ์์ด๋ค.
์๋ฌด๋ฆฌ ํ๋ฅญํ ๋ฐฉ์์ผ๋ก ์ํธํ๊ฐ ๋์๋ค๊ณ ํ๋๋ผ๋ ์ํธํ์ ๋ณตํธํ์ ํค๊ฐ ๋์ผํ๋ฏ๋ก ๋ณตํธํํ๋ ์ชฝ์ ํค๋ฅผ ์ ๋ฌํด์ผ ํ๋๋ฐ, ์ด ๊ณผ์ ์์ ํค๊ฐ ๋์ถ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๊ทธ๋ผ ๊ฒฐ๊ตญ ์ํธํ๋ฅผ ํ์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก ๋ณด์์ฑ์ด ๋งค์ฐ ๋ฐ์ด๋๋ค๊ณ ๋ ํ ์ ์๋ค.
์ ๋ฆฌ
- ์ํธํ ํค์ ๋ณตํธํํค๊ฐ ๊ฐ๋ค
- ํค ๋ฐฐ์ก์ ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ค.
- AES, DES, ARIA
๋น๋์นญํค ์ํธ
๋น๋์นญํค ์ํธ๋ ์ํธํ ํค์ ๋ณตํธํ ํค๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ด๋ค.
๋น๋์นญํค๋ ๋ชจ๋์๊ฒ ๊ณต๊ฐ๋ ๊ณต๊ฐํค์ ๊ฐ์ธ๋ง ์์งํ๋ ๊ฐ์ธํค๋ก ๊ตฌ์ฑ๋์ด ์๋๋ฐ, ์ํธํ๋ฅผ ์ํํ ๋ ๊ณต๊ฐํค๋ ๋น๋ฐํค ์ค ํ๋์ ํค๋ก ์ํธํ๋ฅผ ์ํํ๊ณ ๋ณตํธํ๋ ๋ฐ๋์ ๊ทธ์ ๋ฐ๋ ํค๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
๊ทธ๋ผ ์์ ๋งํ ๋์นญํค์ ๋ฌธ์ ์ ์ธ ํค๋ฐฐ์ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ๋์ง๋ง ์๋์ ์ผ๋ก ๋๋ฆฐ ๋จ์ ๋ ์กด์ฌํ๋ค.
๊ทธ๋์ ๋ช๋ช์ ์๋ฃจ์ ์์๋ ๋น๋์นญ ์ํธ๋ฅผ ์ด์ฉํด์ ๋์นญ ํค๋ฅผ ๋ฐฐ์กํ๊ณ ์ค์ ์ํธ๋ฌธ์ ๋์นญํค ์ํธ๋ฅผ ์ฌ์ฉํ๋ ์์ผ๋ก ์ด์ํ๊ธฐ๋ ํ๋ค.
์ฐ๋ฆฌ ์ค์ต์ ๋น๋์นญํค๋ฅผ ์ด์ฉํ์ง ์๊ณ ๋์นญํค๋ง ์ด์ฉํ๋ ๊ฒ์ผ๋ก ๋ณด์ฌ์ค ๊ฒ์ด๋ค. ๋น๋์นญํค๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ๋์นญํค๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ๋ ํฌ๊ฒ ๋ฒ์ด๋์ง ์๋๋ค.
์ ๋ฆฌ
- ์ํธํ ํค์ ๋ณตํํํค๊ฐ ๋ค๋ฅธ ๊ณต๊ฐํค ๋ฐฉ์์ด๋ค.
- ์๋ณตํธ์ ์๊ฐ์ด ์์๋๋ค.
- RSA, DSS, Rabin
Spring Cloud Config ์ encrypt, decrypt
Spring Cloud Config ์๋ ์ฌ๋ฌ ํน์ง๋ค์ด ์กด์ฌํ๋๋ฐ, ๊ทธ ์ค์์ encrypt์ decrypt ์ ๋ํด์ ์์๋ณด์.
Spring Cloud Config ์์๋ ์ค์ ํ์ผ ์๋ณธ์ {cipher}
์ด๋ผ๋ ๋ฌธ์์ด์ด ์กด์ฌํ๋ค๋ฉด ํด๋น ๋ฌธ์์ด์ ์ํธํ ๋ ๊ฒ์ผ๋ก ํ๋จํ๊ณ ๊ฐ๊ธฐ ๋ค๋ฅธ ์๋ฒ์ ์ค์ ์ ๋ณด๋ฅผ ๋ด๋ฆด ๋, ํด๋น ์ํธ๋ฌธ์ ๋ณตํธํํ์ฌ ๋ด๋ ค์ค๋ค.
์ฆ, git ์ ์ฅ์์ ๋ค์๊ณผ ๊ฐ์ด ํ์ผ์ด ์ ์ฅ๋์ด ์๋ค๋ฉด
spring:
datasource:
username: test
password: "{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ"
spring cloud config ๊ฐ ์ด ์ํธ๋ฌธ์ ํด๋ ํ๊ธฐ ์์ํ๋๋ฐ, ๋ง์ฝ ํค๊ฐ ์กด์ฌํ๊ณ ํด๋น ์ํธ๋ฌธ์ด ๋ณตํธํ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ ์์ ์ธ ๋ฌธ์์ด๋ก ๋ฐํํด์ ์๋ตํด์ค๋ค.
spring:
datasource:
username: test
password: test1234
ํ์ง๋ง ํด๋น ์ํธ๋ฌธ์ด ํค๊ฐ ์ผ์นํ์ง ์๊ฑฐ๋ ํ๋ ์ด์ ๋ก ๋ณตํธํ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉด n/a
๋ผ๋ ๋ฌธ์์ด์ ๋ฐํ์์ผ์ค๋ค.
/encrypt ์ /decrypt ์๋ํฌ์ธํธ
์ฐ๋ฆฌ๋ ์ง์ ํด๋น ์ํธํ์ ๋ณตํธํ๋ฅผ config ์๋ฒ๋ฅผ ํตํด์ ์ํํ ์ ์๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ url ์ ์ด์ฉํ ์ ์๋ค.
- ์ํธํ :
http://config-server.com/encrypt
: POST - ๋ณตํธํ :
http://config-server.com/decrypt
: POST
ํ์ง๋ง ์ด ์๋ํฌ์ธํธ๋ ๊ทธ๋ฅ ์ฌ์ฉํ ์ ์๋ค.
์ ์ ํ key store๊ฐ ์กด์ฌํด์ผ ํ๋๋ฐ, ๋ง์ฝ key store์ด ์กด์ฌํ์ง ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๋ฅผ ๋ง๋ ๊ฒ์ด๋ค.
์ค์ตํ๊ธฐ
๊ทธ๋ผ ์ฐ๋ฆฌ๋ Config ์๋ฒ์ ์กด์ฌํ๋ ์ค์ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๊ฐ๊ฐ ์ํธํ ๊น?
์ฐ์ ์ฐ๋ฆฌ๋ ์ง๋ ์๊ฐ๋์ user-service ์๊ฒ 2๊ฐ์ ์ค์ ์ ๋ณด๋ฅผ ๋๊ฒผ๋ค.
์ฌ๊ธฐ์ ์กฐ๊ธ ๋ณ๊ฒฝํด์ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๋๊ธด๋ค๊ณ ํด๋ณด์.
# application.yml
default:
owner: config-service's git folder
content: :) ์๋
ํ์ธ์ ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค์์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ์
๋๋ค.
# user-service.yml
jwt:
token:
key: my_token_secret_key
# user-service-test.yml
spring:
datasource:
driver: com.mysql.jdbc.Driver
url: http://db.com
username: test
password: test
์์ ์ด์ผ๊ธฐํ๋ฏ, ํด๋น ์ค์ต์ ์ง๋ ์๊ฐ Spring Cloud Config์ name, profiles ๊ทธ๋ฆฌ๊ณ Github ๋ฅผ ์ฐ๋ํด์ ์ค์ ํ์ผ ๊ด๋ฆฌํ๊ธฐ์ ์์กดํ๊ณ ์์ต๋๋ค. ๋ง์ฝ ์ค์ต์ ๋ฐ๋ผํ์๊ธธ ์ํ์ ๋ค๋ฉด ์ง๋ ์๊ฐ์ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์
user-service ์์๋ http://config-servcer.com/user-service/test
๋ฅผ ํธ์ถํ์ฌ yml ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๊ฒ์ธ๋ฐ, ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋์ด์ค๋์ง ํ์ธํด๋ณด์.
์ฌ๊ธฐ์ ๋ฏผ๊ฐ ์ ๋ณด๋ผ๊ณ ํ๋ค๋ฉด ๋ญ ๋ค์ํ ๊ฒ๋ค์ด ๋ฏผ๊ฐํ๊ฒ ์ง๋ง ๊ทธ ์ค์์ ํ ํฐ ๊ฐ๋ง ์ํธํ๋ฅผ ํด๋ณด๋๋ก ํ์
user-service.yml
์ jwt.token.key
๋์นญํค๋ก ์ค์ ์ ๋ณด ์ํธํ ํ๊ธฐ
๋์นญํค๋ก ์์ ์ ๋ณด๋ค์ ์ํธํ ํด๋ณด์.
์์
- bootstrap.yml์ ์ด์ฉํด key store ์ถ๊ฐํ๊ธฐ
- bootstrap ์์กด์ฑ ์ถ๊ฐํ๊ธฐ
- bootstrap.yml์ ํค ์ ์ฅํ๊ธฐ
- /encrypt, /decrypt ์๋ํฌ์ธํธ ์ฌ์ฉํด์ ์ํธํํ๊ธฐ
- yml ํ์ผ์ ์ํธํ๋ ๋ฌธ์์ด์ ๋ฃ๊ณ ์๋ต์ผ๋ก ๋ณตํธํ๋ ๋ฌธ์์ด ๋ฐ๊ธฐ
bootstrap.yml์ ์ด์ฉํด key store ์ถ๊ฐํ๊ธฐ
์ฐ์ ๋์นญํค๋ก ์ํธํ๋ฅผ ์ํํ์ฌ /encrypt, /decrypt ๋ฅผ ์ด์ฉํ๋ค๋ฉด ์์ ๋ณธ๊ฒ์ฒ๋ผ key store ์ด ์กด์ฌํด์ผ ํ๋ค.
๋จผ์ bootstrap.yml ์ application.yml๊ณผ ๊ฐ์ depth ์ ์์ฑํด์ฃผ์.
์ฐ๋ฆฌ๋ bootstrap.yml์ ์ฐ๋ฆฌ์ ๋์นญ ํค๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด๋ค.
์์กด์ฑ ์ถ๊ฐํ๊ธฐ
์ง๋๋ฒ ์ธ๊ธํ์ง๋ง bootstrap.yml์ application.yml ๋ณด๋ค ๋จผ์ ๋ก๋๋๊ธฐ ์ ์ ์ด๋ ํ ์ค์ ์ ๋ณด๋ฅผ ์ฃผ์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค.
ํ์ง๋ง Spring Cloud ์์๋ bootstrap.yml ์์กด์ฑ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ด์์ง ์๊ธฐ ๋๋ฌธ์ build.gradle ์ ๋ค์ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ฃผ์.
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
bootstrap.yml์ ํค ์ ์ฅํ๊ธฐ
๊ทธ๋ฆฌ๊ณ bootstrap.yml ์ ๋ค์๊ณผ ๊ฐ์ด ํค๋ฅผ ์ ์ฅํด์ฃผ์.
encrypt:
key: my_symmetric_key
IDE ์์ ํด๋น ์ค์ ์ ํ๋ค๋ฉด symmetric (๋์นญํค)๋ฅผ ์ด์ฉํ๋ค๊ณ ์๋ ค์ค๋ค.
/encrypt, /decrypt ์๋ํฌ์ธํธ ์ฌ์ฉํ๊ธฐ
- ์ํธํ :
http://config-server.com/encrypt
POST - ๋ณตํธํ :
http://config-server.com/decrypt
POST
๋ฅผ ์ด์ฉํด์ body ์ ์ํธํ๋ฅผ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ํธํ๋ ๋ฌธ์์ด์ ๋ฐํํด์ฃผ๋๋ฐ, ์ฐ๋ฆฌ์ user-service.yml ์ ์๋ ํ ํฐ ๊ฐ์ ์ํธํ ํด๋ณด์.
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด ์ํธํ๋ ๋ฐ์ดํฐ๊ฐ ๋์ค๊ฒ ๋๋ค.
์ฐ๋ฆฌ๋ Config ์๋ฒ์์ ํด๋น ๋ฌธ์์ด์ ์ฝ์ ๋ ๋ณตํ๋ฅผ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ฌ์ฉ์, ์ฆ Config ์ ๋ณด๋ฅผ ๋ฐ๋ ๋ง์ดํฌ๋ก์๋น์ค์๊ฒ ์ ๋ฌ๋ ๋๋ ๋ณตํธํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค๊ณ ์์ํ๋ค.
yml ํ์ผ์ ์ํธํ๋ ๋ฌธ์์ด์ ๋ฃ๊ณ Config ์๋ฒ์ ์๋ต์ผ๋ก ๋ณตํธํ๋ ๋ฌธ์์ด ๋ฐ๊ธฐ
์ด์ ์ฐ๋ฆฌ์ Config ์๋ฒ๊ฐ ๋ณตํธํ๋ ๋ฌธ์์ด์ ์ ์ฌ์ฉํ๋์ง ์์๋ณด๊ธฐ ์ํด์ ์ค์ ์์ฒญ์ ๋ณด๋ด๋ณด์.
yml ํ์ผ์๋ {cipher}
๋ผ๋ ์ ๋์ฌ๋ฅผ ํฌํจ์์ผ ํด๋น ๋ฌธ์์ด์ด ์ํธํ๋์๋ค๋ ๊ฒ์ ์๋ ค์ค์ผ ํ๋ค.
jwt:
token:
key: "{cipher}8fe09399c96cdc1bee0cc3dafea404335a5bdd879e4cd85547fd1e7fbe774e11b3adc2c20634d16501be77987bbc210f"
์ด๋ ๊ฒ ์ ์ฅํ๊ณ ์๊ฒฉ ์ ์ฅ์๋ก push ํ์.
์ ์ ์ฅ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด์ config ์๋ฒ๋ฅผ ์ฌ๊ธฐ๋ ์ํค๊ณ user-service ์ค์ ์ ๋ณด๋ฅผ ๋ฐ๋ ์์ฒญ์ ๋ณด๋ด๋ณด์.
๊ทธ๋ผ ์์ ๊ฐ์ด ์ ์ฅ์์๋ ์ํธ๋ฌธ์ผ๋ก ์ ์ฅ๋์์ง๋ง ์ค์ config ์๋ฒ์ ์ค์ ํ์ผ ์๋ต์ ๋ณตํธํ๋ ๊ฐ์ผ๋ก ๋ฐํํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋๊ธ