[팀 프로젝트 (제시요)]보안강화를 위한 정보 저장

프로젝트 (제시요) 팀 블로그 내용
화낼거양's avatar
Dec 24, 2024
[팀 프로젝트 (제시요)]보안강화를 위한 정보 저장
 
💡
토큰 발급을 위한 키 값 같은 민감한 정보는 노출 위험이 크고, 특히 소스 코드가 버전 관리(Git 등)에 포함될 경우 심각한 보안 문제가 발생할 수 있기 때문에 코드에 직접 하드코딩하지 않아야한다.
이번 프로젝트에서는 팀원들과 공유하는 git에 키 값의 정보가 들어가야했기에 간단하게 Vo파일만 만들어 사용했지만
// vo 파일 package com.metacoding.web_project.user; import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Getter @Component public class CheckAccountVo { private final String impKey = "발급받은 imp_key 값"; private final String impSecret = "발급받은 imp_secret 값"; private final String tokenUrl = "https://api.iamport.kr/users/getToken"; private final String getNameUrl = "https://api.iamport.kr/vbanks/holder"; }
보안을 위해서는 키 값의 노출을 막기 위해 소규모 프로젝트에서는 환경변수를 사용하거나 외부 설정 파일을 사용한다. 대규모 프로젝트에서는 비밀 관리 시스템을 도입하거나, 외부 설정 파일과 함께 비밀 관리 시스템을 사용한다.
 
 
 

1. 환경 변수 사용

 
: 민감한 정보를 환경 변수에 저장하고, 애플리케이션에서 이를 참조한다.
 

(1) 환경 변수 설정

운영 체제 또는 배포 환경에 환경 변수를 설정한다.
  • Linux/MacOS:
    • export IMP_KEY=발급받은 imp_key 값 export IMP_SECRET=발급받은 imp_secret 값
  • Windows (cmd):
    • set IMP_KEY=발급받은 imp_key 값 set IMP_SECRET=발급받은 imp_secret 값

(2) Java에서 환경 변수 읽기

System.getenv()를 사용해 환경 변수를 읽는다.
import org.springframework.stereotype.Component; @Component public class CheckAccountVo { private final String impKey = System.getenv("IMP_KEY"); private final String impSecret = System.getenv("IMP_SECRET"); public String getImpKey() { return impKey; } public String getImpSecret() { return impSecret; } }

(3) 장점

  • API 키를 코드에 하드코딩하지 않음.
  • 운영 환경에 따라 환경 변수를 쉽게 변경 가능.
  • Git 등에 민감한 정보가 노출되지 않음.
 
 
 
 

2. 외부 설정 파일 사용

 
:application.properties or application.yml로 관리
민감한 정보를 Spring 설정 파일에서 관리하고, 설정 파일은 반드시 환경별로 분리하거나 외부에 별도로 저장한다.

(1) 설정 파일 예시

application.properties 또는 application.yml에 민감한 정보 저장:
check-account.imp-key=발급받은 imp_key값 check-account.imp-secret=발급받은 imp_secret값

(2) VO에서 값 주입

Spring의 @Value를 사용해 설정 파일에서 값을 가져온다.
java 코드 복사 import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class CheckAccountVo { @Value("${check-account.imp-key}") private String impKey; @Value("${check-account.imp-secret}") private String impSecret; public String getImpKey() { return impKey; } public String getImpSecret() { return impSecret; }

(3) 설정 파일 외부화

  • 민감한 정보는 프로젝트에 포함하지 않고 외부 설정 파일로 관리한다.
  • Spring Boot에서는 application.properties를 외부에서 읽도록 설정할 수 있다. 예) 실행 시 설정 파일 지정 :
    • java -jar app.jar --spring.config.location=/path/to/application.properties

(4) 장점

  • 설정 파일로 관리하기 때문에 운영 환경에 따라 유연하게 변경 가능.
  • 코드에 민감한 정보를 하드코딩하지 않음.
  • 외부화하면 민감한 정보가 소스 코드에서 분리됨
 
 
 

3. 비밀 관리 시스템 사용

 
대규모 애플리케이션에서는 AWS Secrets Manager, HashiCorp Vault 등 비밀 관리 도구를 사용하는 것이 좋습니다.
 

장점

  • 비밀을 중앙에서 안전하게 관리.
  • 비밀 회전(주기적 변경) 및 접근 제어 가능.

단점

  • 추가적인 비용 및 설정이 필요.
  • 소규모 프로젝트에는 과할 수 있음
 
Share article

moohyun