토큰 발급을 위한 키 값 같은 민감한 정보는 노출 위험이 크고, 특히 소스 코드가 버전 관리(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