[Korean FE Article] 환경변수에 시크릿 값을 저장하지 않고 사용하는 더 나은 방법
글 링크: https://bit.ly/3CCk08b
소개
우리가 자바스크립트로 프론트엔드나 백엔드 작업을 할 때는 환경 변수 관리를 위해 .env 파일을 사용하는 경우가 많습니다. 개발을 시작할 때 대부분 이렇게 관리하는 모습을 보았고, 아무래도 이 글에서 언급하는 것처럼 그렇게 하는 것이 편하기 때문일 것입니다.
이 글은 크게 두 가지를 다루고 있습니다. 첫 번째는 환경 변수에 시크릿 값을 저장하는 것이 왜 위험한지, 다양한 실제 사례를 통해 설명해줍니다. 두 번째는 시크릿 값을 안전하게 사용하는 다양한 방법에 대해 소개합니다. 이 글이 여러분이 운영하는 서비스의 보안 강화에 도움이 되길 바랍니다.
참고로 글 내에는 없지만 도플러 라는 서비스도 개인적으로 좋게 봤습니다!
목차
환경 변수에 시크릿 값을 저장하는 것이 잘못되었나?
환경 변수에 시크릿 값을 저장하지 말아야 하는 이유
❌ 이유 1: 환경 변수의 시크릿 값 관리가 잘 안됨
❌ 이유 2: 프론트엔드와 백엔드 SSR 사이의 모호한 경계로 인해 시크릿 값이 유출
❌ 이유 3: .env 파일의 시크릿 값은 유출되기 너무 쉬움
❌ 이유 4: 로그를 통한 시크릿데이터 유출
실제 사례: Seneca CVE-2019-5483
❌ 이유 5: 생성된 프로세스는 기본적으로 동일한 환경을 공유
FAQ: 하지만 내 애플리케이션에서는 자식 프로세스를 생성하지 않아요!
❌ 이유 6: 프로세스 목록에서 환경 변수 노출
FAQ: 하지만 다른 사용자의 프로세스를 볼 수는 없어요
FAQ: 하지만 시스템에 접근하긴 어려워요
경로 탐색 취약점이 환경변수의 시크릿 값들을 노출
❌ 이유 7: 빌드 인수값들 및 .env 파일들이 도커 이미지로 유출되는 경우
더 나은 시크릿 값관리를 위한 제안
"시크릿 제로" 문제 해결
가장 쉽고 편한 방법: 시크릿 값 저장소
더 안전하고 복잡한 방법: 시크릿 값 관리 서비스
FAQ
시크릿 값 관리 서비스를 사용하더라도 여전히 클라이언트 비밀 값들을 환경 변수로 전달해야 하지 않나요?
환경변수는 악의적인 의존성으로부터 어떻게 보호하나요?
시크릿 값들을 안전하게 관리를 하면 악의적인 의존성으로부터 일정 부분 보호되나요?
"시크릿 제로"를 따르고 제한된 초기 시크릿을 제공하는 방법은?
Lambda에서 Node.js 애플리케이션을 실행 중인데 이 글이 관련이 있나요?