로그인 기능 구현하면서 토큰 요청에 필요한 client secret key가 env 파일에 기록하였는데 private key는 절대 노출되면 안 된다.
그래서 숨겨야하는데 env 파일을 안 올리면 다른 개발자들은 매번 환경 변수를 수동으로 추가하거나 파일을 디스크에 저장하고 배포해야 할 것이다.
이런 과정을 없애기 위해 env 파일을 암호화하여 올리고 복호화 권한만 있다면 env를 자동으로 적용하고 배포에서까지 노출하지 않고 자동으로 할 수 있는 방법을 찾아보았다.
git repo에 private data를 올릴 때 사용하는 bash tool 이라고 한다. gpg(GNU Privacy Guard)를 사용해 암호화를 한다고 한다!
Mac OS 기준으로 설치하였다.
https://git-secret.io/ 에서 installation을 참고하였다. npm 패키지로 따로 있는 것이 아니라 mac에서 오픈 소스 설치 관리 패키지인 homebrew를 이용해 설치하여야 한다고 설명이 있었다.
설치 확인의 쉬운건 패키지 이름 그대로 쳐보는 것이다. 그럼 사용할 수 있는 커맨드 리스트를 대부분 보여준다.
숨길 대상 파일은 아래처럼 민감한 정보로 구성되어 있을 것이다. 반드시 env 파일이 아니어도 된다.
user@devicename blog_server % cat .env
KAKAO_CLIENT_ID="/* secret */"
KAKAO_CLIENT_SECRET="/* secret */"
KAKAO_AUTH_URL="/* secret */"
KAKAO_AUTH_TOKEN_URL="/* secret */"
KAKAO_REDIRECT_URL="/* secret */"
gpg key 생성
blog_server % gpg --gen-key
gpg (GnuPG) 2.3.6; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Note: Use "gpg --full-generate-key" for a full featured key generation dialog.
GnuPG needs to construct a user ID to identify your key.
Real name: coolchaem
Email address: /*개인메일*/@gmail.com
You selected this USER-ID:
"coolchaem </*개인메일*/@gmail.com>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
/* passphrase 작성하라는 창이 생기는데 비밀번호를 생성해주면 됩니다 */
설치가 잘 되었는지 생성이 잘 되었는지 확인하는 습관이 있어야 터미널 작업엔 편하다.
blog_server % gpg --list-secret-keys
blog_server % gpg --armor --export your.email@address.com > public-key.gpg
blog_server % gpg --import public-key.gpg
blog_server % cat public-key.gpg
git-secret 설정
1. 기존 git 처럼 init을 해준다. 그러고나면 .gitsecret 폴더가 생기고 내부에 keys, paths 폴더가 생기는 것을 볼 수 있다. 아직 내용을 추가하진 않아서 폴더, 파일의 내용은 비어있다.
user@devicename blog_server % git secret init
git-secret: init created: '/Users/seongchaemin/Workspace/blog_server/.gitsecret/'
user@devicename blog_server % ls .gitsecret/
keys paths
user@devicename blog_server % ls .gitsecret/paths
mapping.cfg
user@devicename blog_server % ls .gitsecret/keys
user@devicename blog_server % git secret tell -m
gpg: keybox 'blog_server/.gitsecret/keys/pubring.kbx' created
gpg: blog_server/.gitsecret/keys/trustdb.gpg: trustdb created
git-secret: done. /*계정*/@gmail.com added as user(s) who know the secret.
// .gitignore에 대상이 되는 파일도 추가
user@devicename blog_server % vi .gitignore
user@devicename blog_server % cat .gitignore
# node modules
node_modules/
# test coverage
src/coverage/
.gitsecret/keys/random_seed
!*.secret
.env
이 작업을 거치면 .secret 확장자가 붙은 새로운 파일이 생성된다. 내용물은 암호화가 되어 원본 텍스트를 확인할 수 없는 상태를 확인할 수 있다.
user@devicename blog_server % git secret add .env
user@devicename blog_server % git secret hide
git-secret: done. 1 of 1 files are hidden.
user@devicename blog_server % git status
On branch f/oAuthLogin/chaemin_seong
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .gitignore
modified: src/router/loginApi.ts
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.secret
.gitsecret/
reveal을 이용하면 복호화가 풀린다. 다른 컴퓨터에 private key를 전달하는건 아무래도 임의로 추가해야할 거 같은데 되는지 테스트 해봐야한다.
user@devicename blog_server % mv .env .env.backup
// ls -a 로 .env 없는걸 확인 가능
user@devicename blog_server % git secret reveal
git-secret: done. 1 of 1 files are revealed.