본문 바로가기

TIL(Today I Learned it)

TIL.46 올바른 TOKEN & API 관리 법

토큰 token

저는 이번 Spring 강의를 수강하고 내용을 따라가면서

ADMIN TOKEN과 API들을 Service 디렉토리에 저장을 했는데요,

정보보안 측면에서 서비스 디렉토리에 토큰을 저장하는 것은 권장되지 않습니다.

admin token
admin token
kakao api
kakao api
naver api
naver api

 

토큰을 민감한 정보로 취급해야 하는 이유는,

토큰이 노출될 경우 공격자가 인증된 사용자로서 시스템에 접근할 수 있기 때문입니다.

 

특히 Service 디렉토리는 코드와 함께 배포되며, 코드 저장소에서 관리되므로

이러한 중요한 정보를 직접 포함하는 것은 안전하지 않습니다.

1. 보안상의 문제점

1) 소스 코드 유출 위험

서비스 디렉토리나 코드 저장소에 토큰이 포함되어 있다면,

코드가 유출 되거나 개발 환경에서 잘못 배포될 경우 토큰도 함께 노출됩니다.

2) 공격 대상이 됨

민감한 정보가 포함된 파일이 코드베이스에 있을 경우,

악의적인 사용자나 공격자가 이를 표적으로 삼을 수 있습니다.

2. 권장 사항

토큰과 같은 민감한 데이터를 보호하기 위해 다음과 같은 방법을 사용하는 것이 좋습니다.

1) 환경 변수 사용 (Environment Variables)

  • 민감한 정보는 환경 변수에 저장하고, 애플리케이션은 실행 시 환경 변수에서 값을 읽도록 합니다. 이를 통해 소스 코드에 민감한 정보를 직접 포함하지 않게 됩니다.
  • ex) export TOKEN = "your_token_value" 명령어로 서버 환경에 설정하고, 코드 내에서 System.getenv("TOKEN")과 같은 방식으로 불러오는 방법

2) 보안 파일 또는 설정 관리 도구 사용

  • .env 파일 또는 다른 설정 파일에 토큰을 저장하고, 이를 버전 관리 시스템에 포함시키지 않도록 .gitignore 등에 추가해야 합니다.
  • 또한, AWS Secrets Manager, Azure Key Vault, HashiCorp Vault 와 같은 비밀 관리 도구를 사용하여 민감한 정보를 안전하게 저장하고 접근할 수 있도록 합니다.

3) 구성 파일 암호화

민감한 데이터를 저장할 경우,

이를 암호화된 형태로 구성 파일에 저장하고

실행 시 복호화 하는 방법을 사용할 수 있습니다.

이 경우 복호화를 위한 키 역시 환경 변수 등을 통해 안전하게 관리해야 합니다.

4) 전용 보안 서비스 사용

클라우드 환경을 사용하는 경우,

클라우드 제공자가 제공하는 비밀 관리 서비스를 사용해

민감한 데이터를 안전하게 관리할 수 있습니다.

예를 들어, AWS Secret ManagerAzure Key Vault

민감한 정보를 저장하고 애플리케이션에서 이를 안전하게 가져올 수 있도록 합니다.

4. Spring Boot(JAVA)에서의 .env 파일 관리

.env 파일은 애플리케이션 설정 값을 관리하는 데 사용되는 환경 설정 파일입니다.

이 파일을 사용하면 민감한 정보를 쉽게 관리할 수 있고,

코드와 분리하여 보안성을 높일 수 있습니다.

 

Java에는 .env 파일을 손쉽게 불러오기 위해 dotenv 라이브러리를 사용할 수 있습니다.

대표적으로 dotenv-java와 같은 라이브러리를 활용할 수 있습니다.

1) dot env 라이브러리 사용

① 라이브러리 추가

dotenv-java 라이브러리를 사용하려면 프로젝트에 해당 라이브러리를 추가해야 합니다.

일반적으로 Maven이나 Gradle을 사용하여 의존성을 추가할 수 있습니다.

  • Maven
<dependency>
    <groupId>io.github.cdimascio</groupId>
    <artifactId>dotenv-java</artifactId>
    <version>3.1.4</version>
</dependency>
  • Gradle
implementation 'io.github.cdimascio:dotenv-java:3.1.4'

 

② .env 파일 작성

프로젝트의 루트 디렉토리에 .env 파일을 생성하고 필요한 환경 변수들을 추가합니다.

TOKEN=your_token_value
DB_PASSWORD=your_db_password

③ Java 코드에서 불러오기

Java 코드에서 dotenv 라이브러리를 사용해 .env 파일의 값을 불러올 수 있습니다.

import io.github.cdimascio.dotenv.Dotenv;

public class EnvLoader {
    public static void main(String[] args) {
        Dotenv dotenv = Dotenv.load();  // .env 파일 로드
        String token = dotenv.get("TOKEN");
        String dbPassword = dotenv.get("DB_PASSWORD");

        System.out.println("Token: " + token);
        System.out.println("DB Password: " + dbPassword);
    }
}

④ 설정 파일 위치 조정

기본적으로 .env 파일은 프로젝트 루트 디렉토리에 위치해야 합니다.

만약 특정 경로에 .env 파일이 있을 경우, 아래와 같이 경로를 지정할 수 있습니다.

Dotenv dotenv = Dotenv.configure().directory("/path/to/your/env").load();

2) Java 기본 기능을 이용해 수동으로 로드하기

Java의 표준 기능만을 사용하여 .env 파일을 읽고 환경 변수로 설정하는 방법도 있습니다. 이 경우 .env 파일의 내용을 직접 파싱하고 환경 변수로 설정합니다.

① .env 파일 작성

.env 파일을 프로젝트 루트에 작성합니다.

TOKEN=your_token_value
DB_PASSWORD=your_db_password

② Java 코드에서 직접 읽기

Java에서는 파일을 읽고 각 줄을 파싱하여 키-값 쌍을 처리하고,

이를 시스템 속성으로 설정할 수 있습니다.

다음은 .env 파일을 수동으로 읽는 예시입니다.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class ManualEnvLoader {
    public static void main(String[] args) {
        try {
            List<String> lines = Files.readAllLines(Paths.get(".env"));
            for (String line : lines) {
                // 빈 줄 또는 주석(#)인 경우 건너뜀
                if (line.trim().isEmpty() || line.startsWith("#")) {
                    continue;
                }

                String[] keyValue = line.split("=", 2);
                if (keyValue.length == 2) {
                    String key = keyValue[0].trim();
                    String value = keyValue[1].trim();
                    System.setProperty(key, value);
                }
            }

            // 환경 변수 사용 예
            String token = System.getProperty("TOKEN");
            String dbPassword = System.getProperty("DB_PASSWORD");

            System.out.println("Token: " + token);
            System.out.println("DB Password: " + dbPassword);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

<주의 사항>

  • 파일 경로 : .env 파일의 경로를 올바르게 설정해야 합니다. 예제에서는 프로젝트 루트에 .env 파일이 있다고 가정합니다.
  • 보안 문제 : 민감한 정보를 수동으로 로드할 때는 환경 변수나 시스템 속성에 설정된 정보가 노출되지 않도록 주의해야 합니다.

3) .gitignore 설정

.env 파일은 버전 관리 시스템(Git 등)에 포함되지 않아야 합니다.

이를 위해 .gitignore 파일에 .env 파일을 추가하여 관리에서 제외합니다.

# .gitignore
.env

이렇게 하면 코드 저장소에 .env 파일이 올라가지 않게 되어

외부에 노출될 위험이 줄어듭니다.

5. 요약

서비스 디렉토리에 토큰을 직접 저장하는 것은 보안에 매우 취약하기 때문에 권장되지 않습니다.

대신 환경 변수, 비밀 관리 도구, 암호화된 설정 파일 등을 사용하여

민감한 정보를 관리하는 것이 좋습니다.

이러한 방법들을 통해 민감한 정보가 코드베이스에 포함되지 않도록 하고,

실수로 유출될 가능성을 줄이는 것이 중요합니다.

728x90