안녕하세요. Java백엔드 개발자를 꿈꾸며 공부중인 김은철입니다.
해당 포스팅의 내용은 이해한 내용을 토대로 작성되었습니다.
그렇기 때문에 포스팅에 잘못된 내용이 포함되어 있을 수 있음과 미흡한 점이 있을 수 있습니다.
의아한 내용이나 틀린 내용이 있다면 적극적인 지적과 추가적으로 학습하며 좋을 내용을 알려주시면 감사하겠습니다.
여러분의 지적과 관심은 저의 성장에 큰 도움이 될 것이라 확신합니다.
감사합니다.
주요 구성 환경
IntelliJ IDEA 2022.1.3
Spring Boot 2.7.4
Spring Security 5.7.2
gradle version 7.5
jjwt version 0.11.5
1. 발생 문제
[1] 문제가 된 구성
JWT로그인을 구현하면서 secrectKey를 로컬 환경변수에 저장하고 토큰을 생성하는 JwTokenizer
의 필드인 secretKey
에 값을 저장시키길 바랐습니다. 주요 구성은 아래와 같습니다.
- application.yml
// 기타 옵션 조건 생략
jwt:
key: ${JWT_SECRET_KEY}
access-token-expiration-minutes: 20
refresh-token-expiration-minutes: 300
- 로컬 환경변수 설정
- JwTokenizer.java
@Component
public class JwtTokenizer {
// 시크릿 키
@Getter
@Value("${jwt.key}")
private String secretKey;
// 엑세스 만료시간
@Getter
@Value("${jwt.access-token-expiration-minutes}")
private int accessTokenExpirationMinutes;
// 리프레쉬 토큰 만료시간
@Getter
@Value("${jwt.refresh-token-expiration-minutes}")
private int refreshTokenExpirationMinutes;
// ....이하 코드 내용 생략
}
[2] 문제가 된 이유와 로그
위와 같은 설정을 주었음에도 불구하고 로컬 환경 변수에 저장된 secretKey의 값을 불러오지 못하는 문제가 발생함을 아래와 같은 로그로 확인이 가능했습니다.
- Log
// 이하 로그 생략 ...
2023-01-28 05:59:08.695 DEBUG 20004 --- [ main] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
2023-01-28 05:59:08.705 DEBUG 20004 --- [ main] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
What is secretKey ??????????????????????: 12345678987ab
// 이하 로그 생략 ...
의도에 따른다면 로컬 환경 변수에 저장된 secretKey인 djsafhkjsdaflkjhdsjafhiou3h4ou......
의 키가 출력이 되었어야 했습니다. 저는 이문제에 대해서 2가지 해결 방안을 제시하며 내용은 아래와 같습니다.
2. 문제의 해결 (2가지)
[1] yaml을 두 가지로 나누어 관리하기
문제가 되었을 때는 yaml
파일을 1개로 관리를 했었습니다.
하지만, yaml
파일을 2개로 나누어 관리하는 것이 하나의 대안이 될 수 있을 것이라 생각했습니다.
해당 방식을 통해 얻을 수 있는 이점으로는 github를 통해 프로젝트의 상태관리를 할 때 민감한 정보를 담고있는 yaml
파일을 gitignore
에 추가함으로써 민감한 정보를 손 쉽게 배재할 수 있습니다.
각각의 yaml
파일은 내용은 아래와 같습니다.
- application.yml
// 프로젝트 전반에서 필요한 파일 설정
// 프로퍼티 설정에 대한 코드는 모두 생략하겠습니다.
- application-secretKey.yml
jwt:
key:${JWT_SECRET_KEY}
access-token-expiration-minutes: 20
refresh-token-expiration-minutes: 300
프로젝트 빌드시 두 가지 yaml
을 읽어와 주어야 하기 때문에 아래와 같은 수정을 해주었습니다.
- @SpringBootApplication이 포함된 자바 파일의 수정
@EnableJpaAuditing
@SpringBootApplication
public class JwtApplication {
private static final String PROPERTIES =
"spring.config.location="
+"classpath:/application.yml"
+",classpath:/application-secret.yml";
public static void main(String[] args) {
new SpringApplicationBuilder(JwtApplication.class)
.properties(PROPERTIES)
.run(args);
}
}
파일의 수정을 통해 아래와 같이 의도한 로그를 얻으며 문제를 해결할 수 있었습니다.
- Log
// 이하 로그 생략 ...
2023-01-28 06:17:04.560 DEBUG 22680 --- [ main] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
2023-01-28 06:17:04.568 DEBUG 22680 --- [ main] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
What is secretKey ??????????????????????: djsafhkjsdaflkjhdsjafhiou3h4ou5y483u90tjsdfkasdmfndasfkljho3uh981u5lmdoas8u581uo5jljlkdasaksu09r8109833y5hjasdl
// 이하 로그 생략 ...
[2] 프로젝트 / 컴퓨터 껐다가 다시 켜기 or ItellJ IDE 업데이트
결과부터 이야기하자면 문제가 되었던 코드라고 소개한 부분이 틀린것이 아니었습니다. 추측컨데, IntellJ IDE 자체 오류
로 환경 변수에 저장된 secretKey를 읽어오지 못했던 것 같습니다.
이 문제 외에,
IntellJ IDE 자체 오류
가 생각보다 많습니다.
비슷한 구성을 하신 분이라면 컴퓨터를 껐다가 다시 켜시던, 프로젝트를 껐다가 다시 켜시던, IntellJ IDE
를 업그레이드 또는 다운그레이 해보시길 권장드립니다. 저는 컴퓨터를 껐다가 다시 켜니 문제가 되었다고 소개드렸던 부분이 잘 작동되었습니다.
* 마무리하며
조금은 어처구니가 없었던 문제였습니다. 생각보다 시간 많이 뺐긴거 같은데....