[FIFA Online TMI] Properties 를 통해 API KEY 숨기고 가져오기

Updated:

🐒 API KEY 숨기기

NEXON OPEN API 약관을 보면 발급받은 키를 타인에게 공유하거나 노출시키면 안된다.

물론 그런 약관이 없어도 개인 키는 타인에게 공유하거나 노출시키면 안된다.

유료 API 인 경우 내가 돈을 다 내야하고.. 요청량이 정해져있는 경우 서비스가 중지 될 수도 있다..

그런데 깃허브에 코드를 올리다 보면 실수로 노출을 시킬 수도 있기 때문에 꼭 숨겨야 한다.

스프링 부트는 properties 를 통해 키를 숨기고 관리 할 수 있다.

먼저 숨기고 싶은 키를 저장할 프로퍼티 파일을 생성한다.

resources/application-API-KEY.properties

api-key=YOUR_KEY

api-key 에 저장된 문자열 그대로를 가져오기 때문에 큰 따옴표는 생략한다.

그리고 application.properties 에 추가 시켜준다.

resources/application.properties

	...
	
spring.profiles.include=API-KEY

application- 뒤에 이름을 include 해주면 된다.

그리고 .gitignore 에 resources/application-API-KEY.properties 를 추가하면 API KEY 를 노출시키지 않고 사용 할 수 있다.

🐙 API KEY 가져오기

프로퍼티에 키를 숨겼으니 API 를 찌르는 경우 KEY 를 프로퍼티에서 가져와 사용 해야한다.

먼저 프로퍼티에 있는 KEY 를 가져다 줄 클래스를 생성한다.

~/config/ApiKey.java

package com.fifaonline.tmi.config;


import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Getter
@Component
public class ApiKey {
    @Value("${api-key}")
    private String key;

    private static ApiKey instance = new ApiKey();

    private ApiKey() {
    }

    public static ApiKey getInstance() {
        if (instance == null) {
            instance = new ApiKey();
        }
        return instance;
    }
}

프로퍼티에 있는 값을 사용하기 위해 해당 클래스를 @Component 를 통해 스프링 빈으로 등록한다.

그리고 @Value 를 사용하면 저장 된 키 값을 가져올 수 있다.

이 클래스는 키를 필요로 하는 곳에서 전부 사용하기 때문에 중복 생성을 막기 위해 싱글톤 패턴을 적용했다.

[Java] Singleton pattern 구현

🦞 API KEY 사용하기

키를 가져올 클래스도 생성했으니 이제 필요한 곳에 적용만 시키면 된다.

서버단에서 키가 필요한 경우 인스턴스를 가져와 사용하면 되고 프론트단에서 필요한 경우 fetch 를 통해 가져오면 된다.

먼저 서버단에서 필요한 경우 @Inject 를 사용 해 인스턴스를 가져온다.

@Inject
private ApiKey apiKey;

private final String KEY = apiKey.getKey();

어노테이션을 사용하는 대신 private final ApiKey apikey = ApiKey.getInstance(); 를 사용해도 상관없다.

그리고 프론트단에서 필요한 경우 fetch 와 GET 을 통해 값을 가져와 사용한다.

@GetMapping("/api/v1/key")
public String requestApiKey() {
    return apiKey.getKey();
}
fetch("/api/v1/key")
            .then(res => res.text())
            .then(key => {})

📬 정리

이렇게 하면 숨기고 싶은 정보를 숨길 수 있다.

처음에는 키 값 자체를 저장하는 클래스를 만들고 그 클래스를 깃허브에 커밋하지 않는 방식으로 숨겼는데 문제가 많았다.

우선 배포를 할 수 없다! 가장 중요하다. 물론 jar 파일을 내가 손수 빌드해서 배포 할 서버에 올린다면 상관 없겠다만..

자동화를 하려면 애로사항이 아주 많다.

제일 궁금했던 사항인데 해결해서 굉장히 뿌듯하다.

Github



Categories:

Updated:

Leave a comment