2024.07.17 - [공부하자/Springboot] - [springboot]jasypt라이브러리로 민감정보 암호화 하기(application.yml)-1
**이전글**
지난 시간에는 jasypt라이브러리를 사용해서 application.yml 파일에 담긴 민감정보를 암호화하는 방법에 대해서 알아보았다. 오늘은 암호화했던 정보를 스프링이 잘 복호화해주는지 실제 어플리케이션을 구동시켜 보며 테스트해 보고 도커 환경에서 사용하는 방법에 대해서 알아보자.
DB연동 테스트
#springboot구동
database연동을 위해 암호화한 값들이 잘 복호화가 되었는지 어플리케이션이 성공적으로 작동하는 모습을 확인할 수 있다. 나는 예전에 만들어놓은 게시판 프로젝트를 암호화하여 테스트해보았다. db연동만 되어있는 아무 프로젝트에 테스트해 보면 된다.
서버배포
만약 jasypt를 사용해 빌드한 프로젝트는 어떻게 배포하면 될까? 지금까지의 예제에서는 복호화를 할 수 있는 암호를 인텔리j라는 IDE에 저장해 놓고 사용했지만 서버환경에서는 IDE를 사용하지 않기 때문에 다른 처리가 필요하다.
#서버에 프로젝트 복사
나는 `springboot-board`라는 프로젝트를 wsl(Ubuntu22.04)로 구동중인 리눅스 서버에 복사했다. 이곳에서 프로젝트 배포를 테스트해 볼 수 있다.
#build 하기
프로젝트 내부에 빌드관련된 도구들이 있다. 나는 gradle형식으로 빌드하고 있기 때문에 gradle과 gradlew파일이 존재하는 것을 확인할 수 있다. gradle를 실행시키면 현재 서버에 설치된 gradle 버전에 따라 빌드가 실행되고 gradlew를 실행하게 되면 프로젝트할 때 지정된 gradle버전을 자동으로 다운로드하여서 빌드를 하게 되어있다. 때문에 gradlew를 실행하면 버전차이로 인한 의존성문제를 피할 수 있다. 참고로 gradlew의 `w` 는 wrapper의 w이다.
아래 명령어로 빌드를 수행한다.
./gradlew clean build
나는 이미 테스트를 하며 빌드가 한번 된 상태이기 때문에 간단하게 빌드작업이 끝났다.
gradlew를 실행하려는데 다음과 같은 메시지가 발생하는 경우가 있을 수 있다.
-bash: ./gradlew: /bin/sh^M: bad interpreter: No such file or directory ~~~
만약 위 에러가 발생하며 빌드가 진행되지 않는다면 이는 스크립트 파일이 windows 형식의 줄 바꿈 문자를 포함하기 때문에 발생하는 문제로 Unix계열 시스템에서 사용하는 줄바꿈 문자형식과의 차이때문에 발생한다. 해결방법으로는 dos2unix 패키지를 설치하여 줄바꿈 문자를 변환해 주면 된다.
#패키지 설치
sudo apt install dos2unix
#변환
dos2unix gradlew
작업이 완료되면 아마 빌드가 잘 될 것이다.
#build파일 생성
빌드가 성공적으로 완료되었다면 프로젝트 내부에 build라는 폴더가 생성되었을 것이다. `/build/libs` 로 파일경로를 이동하면 위처럼 프로젝트명과 일치하는 `SNAPSHOT` 이 있을 것이다.
아래 명령어를 통해 빌드된 프로젝트를 실행할 수 있다. `springboot-board`는 내 프로젝트명이기 때문에 각자 프로젝트 명에 따라 이름이 다를 것이다.
#프로젝트 구동
java -jar <프로젝트명>-0.0.1-SNAPSHOT.jar
#예시
java -jar springboot-board-0.0.1-SNAPSHOT.jar
프로젝트가 잘 구동되는 듯 보이더니 `APPLICATION FAILED...`가 되면서 실행이 되지 않는다.
출력된 에러메시지를 확인해 보니 properties에 값이 없어서 발생하는 문제였다. 인텔리제이에서 실행했을 때는 IDE에서 자동으로 설정값을 넣어줬는데 직접 프로젝트를 실행하려니 그 값이 없어서 에러가 난 것이다.
#실행 시 매개변수로 넣어주기
#1번 방법
java -jar <your-project-name>-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password
#2번 방법
JASYPT_ENCRYPTOR_PASSWORD=password java -jar <your-project-name>-0.0.1-SNAPSHOT.jar
#예시
JASYPT_ENCRYPTOR_PASSWORD=password java -jar springboot-board-0.0.1-SNAPSHOT.jar
공식문서에는 두 가지 방식이 있는데 아무거나 적용해도 실행된다. 알맞은 비밀번호를 잘 기입했다면 아래처럼 실행완료 로그를 볼 수 있다.
Docker컨테이너에서 사용하기
서버 자체에서 `java -jar...` 명령어를 가지고 프로젝트를 구동하는 경우도 있지만 최근에는 도커로 프로젝트를 배포하는 경우가 많기 때문에 도커에서는 환경변수를 어떻게 넣어줘야 하는지 알아보겠다.
#Dockerfile생성
프로젝트 최상위 경로에 Dockerfile을 생성해 준다. Dockerfile은 확장자가 따로 없기 때문에 확장자 없이 생성하면 된다. Dockerfile은 파일이 존재하는 경로를 기준으로 하위경로를 탐색하기 때문에 위치가 중요하다.
#Dockerfile생성
touch Dockerfile
#Dockerfile내용작성
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/springboot-board-0.0.1-SNAPSHOT.jar /app/springboot-board-0.0.1-SNAPSHOT.jar
CMD ["java", "-jar", "springboot-board-0.0.1-SNAPSHOT.jar"]
Dockerfile내용은 가장 기본적인 내용으로 작성하였다. 이 예제는 도커 환경에서 jasypt 암호화를 적용하는 것이기 때문에 Dockerfile의 자세한 내용은 다루지 않는다. 궁금하면 공식문서를 참고하도록 하자.
#Docker image생성
Dockerfile이 생성되었다면 프로젝트를 이미지로 만들어야 한다. 도커는 이미지를 가지고 컨테이너를 생성한다.
#이미지 빌드
docker build -t <image_name>:<version> .
#예시
docker build -t spring_jasypt:1.0 .
빌드과정이 정상적으로 수행되었다.
`docker images` 명령어를 쳐보면 이미지가 생성된 모습을 확인가능하다.
#docker-compose.yml 생성
도커 이미지만 가지고도 컨테이너를 실행할 수 있으나 `docker-compose`로 컨테이너를 관리하면 매우 편리하다. 보통 여러 개의 컨테이너를 다룰 때 사용하지만 그 외에 설정도 편하게 할 수 있기 때문에 docker-compose를 사용하였다.
services:
spring-boot:
container_name: gaden_spring
build:
context: ~/springboot-board
dockerfile: Dockerfile
image: spring_jasypt:1.0
environment:
JASYPT_ENCRYPTOR_PASSWORD: <your_password>
ports:
- "8080:8080"
`environment`에서 편하게 설정변수를 넣어줄 수 있다. `your_password`라고 쓰여있는 곳에 jasypt 복호화 비밀번호를 적어준다.
#docker-compose 실행
docker-compose.yml 작성이 완료되었다면 이제 docker-compose를 통해 컨테이너를 실행시켜 보자.
#docker-compose실행
docker-compose up -d
도커 컴포즈가 관리하는 컨테이너목록이 출력된다. 현재는 하나의 컨테이너만 등록했기 때문에 하나만 보인다.
마지막으로 `docker ps` 명령어로 컨테이너가 실행되는지 확인해 보자. 잘 구동된다.
jasypt라이브러리를 프로젝트에 반영하여 테스트해보고 그다음에는 서버에서 빌드, 배포해 보았다. 마지막으로는 도커환경에서 어떻게 적용하는지 까지 살펴보았는데 비단 jasypt 라이브러리뿐 만 아니라 다른 환경변수 혹은 설정변수들을 위와 같은 환경에서 어떻게 적용하는지 알 수 있는 기회가 되었다.
'공부하자 > Springboot' 카테고리의 다른 글
[springboot]jasypt라이브러리로 민감정보 암호화 하기(application.yml)-1 (0) | 2024.07.17 |
---|---|
[C++]누적 합 구하는 공식 (0) | 2024.04.11 |