[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 를 사용하면 저장 된 키 값을 가져올 수 있다.
이 클래스는 키를 필요로 하는 곳에서 전부 사용하기 때문에 중복 생성을 막기 위해 싱글톤 패턴을 적용했다.
🦞 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 파일을 내가 손수 빌드해서 배포 할 서버에 올린다면 상관 없겠다만..
자동화를 하려면 애로사항이 아주 많다.
제일 궁금했던 사항인데 해결해서 굉장히 뿌듯하다.
Leave a comment