Spring boot 프로젝트를 github public repository에 올리게 되면
application.* 또는 노출되면 안되는 정보가 적힌 파일이 노출될 수 있다.
외부에 중요한 정보가 노출되지 않고 팀과 파일 공유 / 빌드,배포하는 방법을 알아보자
1. git ignore
중요한 파일들을 .gitignore 설정하여 깃허브 리포지토리에 올라가지않게 하는 방법이다.
하지만 application.* 등 빌드에 필요한 파일들은 빌드할때 직접 넣어줘야하고
팀과 파일을 공유할때 어떻게 공유할지 문제가 발생한다.
2. Git Secrets 이용
[해당 방법은 git action을 이용한 ci/cd에서도 사용되는 방법이다.]
application.*이라던지 중요정보가 적힌 파일 자체 또는 중요한 키값을 Git Action Secrets에 저장하여
git workflow를 진행할때 사용할 수 있다.
workflow를 작성하는 yml에서
${}를 이용하여 git secrets의 내용을 가져와 파일을 만들어 넣어줄 수 있다 (secrets에 파일 내용 전체를 저장했을경우)
또는 키값을 저장한 secret을 가져와 설정해줄수도 있다.
또는 application.* 안에서 secret을 가져와 설정 할 수 있다.
이렇게 설정해두고 workflow가 실행되면서 값이 알아서 잘 들어가고 workflow에서 빌드 및 배포까지 설정해줬다면
잘 동작할 것이다.
단점 : 배포환경에 따라 (dev,prod,test 등) 각기 다른 secret값을 가져와 일일이 설정해주어야 할것같다.
추가
git actions secret은 저장된값을 확인 못하는데
git action variable은 확인이 가능하다.( 해당 리포지토리의 collaborator만)
variable로 중요값들을 저장하면 팀과 공유가 되겠지만, 노출될 가능성이 존재한다.
3. git submodules이용
git submodule은 하나의 리포지토리 안에 하위 리포지토리의 데이터를 가져오고 관리할 수 있다.
저장소 a,b 가 있고 저장소 c에는 a,b가 공통으로 사용하는 모듈(라이브러리,환경설정,비밀키값등)이 있다고 했을때
a,b 저장소에 c를 서브모듈로 두어 공통되게 사용할 수 있다. 만약 c의 값이 수정되면 a,b 모두 수정된 코드를 사용할 수 있다.
적용 및 테스트 해보지않음
단점 : c가 private 리포지토리로 두어도, 암호화되서 데이터가 리포지토리에 올라가는것이 아니니까 노출될 가능성이 있다.
c를 팀원끼리 공유하면 공통으로 사용되는 모듈데이터를 쉽게 확인가능하다.
- CI에서 사용한다면, private repo를 clone 할 수 있는 Github Key를 넘겨 설정 파일을 clone 할 수 있다고 한다.
4. Jasypt를 이용한 암호화
java의 Jasypt를 이용하여 중요한 설정값등을 암호화하여 사용할 수 있다.
적용 및 실험해보지 않음.
장점 : 암호화 되어있으므로 유출되어도 비교적 안전
단점 : 암호화할때 사용할 비밀키값을 설정하고 관리해야하는것 같다.
5. 외부 서비스 이용
별도의 Config를 관리하는 Server를 사용하고, 배포시 Config Server와 통신하여 설정파일을 가져오는 방식인
Spring Cloud Config 또는 Aws System Manger,AppConfig 등을 사용할 수 있다.
적용 및 실험해보지 않음.
여러 서버 설정파일을 별도 서버에서 관리 할 수 있다.
Spring Cloud Config 사용시, 서버를 재배포하지않고 설정값을 수정 할 수 있다.
어떤것을 사용해야할까
방법1은 나혼자 개발할때 쓰면될것같고
방법2는 git action Secret을 사용한다고 하면 저장한 설정값을 까먹을 수도 있다. (git action variable은 위험할수도있다)
방법3,4,5가 괜찮은 방법같다. 5는 서버를 하나 더 구성해야하는 부담이 있을 수 있다(큰 프로젝트에서 사용하면 될거같다)
'Spring > Spring' 카테고리의 다른 글
Spring] 예외처리 (@ExceptionHandler , @ControllerAdvice,@RestControllerAdvice), 에러코드,실제 적용 [미완] (0) | 2023.01.24 |
---|---|
Spring Profile마다 Application.* 다르게 사용하기 [미완] (0) | 2023.01.20 |
Spring Boot]로그,로깅,로그를 파일로 저장하기 (LogBack) [미완] (0) | 2023.01.19 |
[swagger] 스웨거 (0) | 2022.10.09 |
의존성주입(DI) (0) | 2022.10.03 |
댓글