HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
SFAM 포트폴리오
SFAM 포트폴리오
/
❗
환경별 Cookie 옵션 설정
❗

환경별 Cookie 옵션 설정

식별

현재 프로젝트에서는 HTTPS 설정과 Secure Cookie를 통해 안전한 쿠키 전달을 지향하고 있습니다.
하지만 Local환경에서는 SSL 인증서 발급, 관련 설정이 번거롭기 때문에 쿠키 관련 테스트 시 매번 secure 옵션을 임시로 지우곤 했습니다.
notion image
하지만 이런 작업 또한 매우 번거로웠었고 개선이 필요해보였습니다.

분석 및 개선 방향

이러한 문제를 해결하기 위해 Local환경에서는 secure을 사용하지 않도록 환경별로 Cookie 옵션 값을 설정할 수 있도록 한다면 로직상의 코드를 수정하지 않고도 유연하게 변경할 수 있을 것으로 판단되었습니다.

해결

첫번째 해결 방안은 @Profile 어노테이션 사용입니다.
CookieConfigurer이라는 인터페이스를 만들고 환경별 구현체를 각각 LocalCookieConfigProperties, DevCookieConfigProperties를 만들어주고 @Profile을 이용해 환경별로 다른 Bean을 등록할 수 있게 만듭니다.
notion image
  • dev 환경의 Cookie 설정 Bean
notion image
  • local 환경의 Cookie 설정 Bean
notion image
 
  • 등록한 Bean을 사용해 Cookie 생성시 설정에 사용
notion image
 
이러한 방식도 잘 동작하지만 코드의 중복이 있고 종종 클라우드 환경인 dev 환경에서도 비교를 위해 local 프로필을 사용해 테스트하고 디버깅할 때가 많았는데 jar파일로 배포되어 있어 매번 jar파일을 업데이트 해줘야하는 번거로움이 있었습니다.
 
이러한 문제 때문에 저는 다음 두번째 방법인 yml로 설정외부 방식을 채택했습니다.
이 방법은 코드의 중복이 없고 jar파일 실행 시 yml파일을 외부에서 지정할 수 있어 간편하게 설정 교체가 가능합니다.
이때 저는 늘 사용하던 생성자 바인딩 방식으로 yml의 설정 정보를 불러왔습니다.
생성자 바인딩의 장점
Yaml의 Property를 Class로 바인딩 해보자
yaml 파일의 프로퍼티들을 불러와서 사용하고 싶을 때가 있다. 예를 들어 JWT의 header, 토큰 이름, 유효기간 등등... 어떻게 클래스에 바인딩을 해주는지 알아보자. 제가 사용할 프로퍼티들은 다음과 같이 계층구조를 이루고 있습니다. Security 설정에 관한 프로퍼티들을 하나의 Bean에 바인딩해 사용하고 싶습니다. 설정 중 jwt 부분만 떼어내어 getter setter 방식을 살펴보겠습니다. 최상단 클래스레벨에 @Component와 @ConfigurationProperties 어노테이션을 사용해줍니다.
Yaml의 Property를 Class로 바인딩 해보자
https://velog.io/@pjh612/Property%EB%A5%BC-Class%EB%A1%9C-%EB%A1%9C%EB%94%A9%ED%95%B4%EB%B3%B4%EC%9E%90
Yaml의 Property를 Class로 바인딩 해보자
  • application-local.yml
    • notion image
  • application-dev.yml
    • notion image
 
  • CookieConfigProperties.java
    • notion image
그리고 마지막으로 쿠키를 생성하는 곳에서 이 설정 Bean을 주입받고 사용해줍니다.
notion image
notion image
 
  • 변경전(하드 코딩되어 설정 변경에 유연하지 못한 방식)
notion image
  • 변경 후(yml로 부터 바인딩받은 환경별 설정 정보를 주입)
notion image
 
이제 환경별 yml 설정으로 유연하게 쿠키 생성이 가능해졌습니다.