git push시 계속해서 인증을 요구하는 경우
문제 상황
현재 프로젝트를 윈도우와 리눅스 컨테이너 양쪽에서 작업을 진행하던 중, github 토큰을 등록을 하게 되었다. 깃허브 홈페이지에서 성공적으로 토큰을 발급받고, 이를 활용하여 비밀번호를 입력한 후 성공적으로 push를 할 수 있게 되었다. 문제는 이후의 push 에서도 계속해서 비밀번호를 요구한다는 점이였다. 환경이 조금 특이해서 (도커 컨테이너 ubuntu, wsl) 다양한 방법을 시도해봤는데, 시간을 예상보다 많이 쏟게 되어 기록을 위해 글을 작성한다.
Linux 환경
방법 0
git config --global credential.helper store
보안적으로 추천하지 않는 방법이다. git이 설치된 위치에서 git-core를 들어가면, git-credential-store라는 파일이 있는데, 거기에 토큰을 기록하는 방식이다. 사실 가장 편하긴 한데, 역시 보안적으로 취약하다는 점에서 권장되는 방식은 아니다.
방법 1
sudo apt-get install libsecret-1-0 libsecret-1-dev
cd /usr/share/doc/git/contrib/credential/libsecret
sudo make
git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
원리는 libsecret이라는 패키지를 설치하여, 해당 패키지에 token을 저장하고 token이 필요한 경우 github는 명시한 credential.helper인 libsecret을 참고하여 인증을 수행한다.
여기까지해서 문제가 없으면 다행인데, 현재 docker 컨테이너 환경에서 작업을 진행하던 중 다음의 에러를 만날 수 있었다.
** (process:23898): CRITICAL **: 12:21:26.791: store failed: Cannot autolaunch D-Bus without X11 $DISPLAY
그래서 위의 방법이 안된다면 다른 방법을 시도해봐야 한다.
방법 2
그래서 어떻게 해결할 것이냐. git-credential-manger를 통해 토큰을 관리할 것이다.
가장 먼저 다음의 명령어로 수행이 가능하다면, 쉽게 갈 수 있다. git-credential-manager가 이미 설치된 경우이다.
git config --global credential.helper manager-core
근데, 내 컨테이너 환경에는 무슨 일이 일어났던 건지, 정상적인 git 경로에 credential-manager가 존재하지 않았다.
/usr/lib/git-core# ls git-credential*
git-credential git-credential-cache git-credential-cache--daemon git-credential-store
그래서 직접 설치해주었다.
먼저 방법 1을 수행하지 않았다면 필요한 패키지를 설치해준다.
sudo apt-get install libsecret-1-dev
다음으로 credential-manager의 패키지 파일을 다운로드하고
(여기가 조금 오래 걸린다. 서버가 빠르지 않다... 최신 버전의 릴리즈는 더 느리다...)
wget https://github.com/microsoft/Git-Credential-Manager-Core/releases/download/v2.0.498/gcmcore-linux_amd64.2.0.498.54650.deb
패키지를 설치해준다.
sudo dpkg -i gcmcore-linux_amd64.2.0.498.54650.deb
여기까지 왔다면 설치는 완료되었고, 잘 설치되었나 확인 한번 해주자.
git credential-manager version
마지막으로 git에 설치한 credential-manager를 사용한다고 등록해주면 끝난다.
git config --global credential.helper manager-core
이후 push 수행 시 문제 없이 업로드가 가능해진다.
wsl, debian
방법 0
git config --global credential.helper store
보안적으로 취약하기에 권장되는 방식은 아니다. (위의 linux 부분을 참고)
방법 1
앞의 방법으로 credential.helper를 활용하면, 다음과 같은 에러 메세지를 만날 수 있다.
could not connect to Secret Service: Cannot autolaunch D-Bus without X11 $DISPLAY
위의 credential-manager를 설치해서 해결을 할 수도 있지만, 좀 더 쉬운 방법이 있다.
바로 윈도우 쪽에 설치된 git에서 자체적으로 제공하는 credential-manager의 경로를 직접 먹여주는 것이다.
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-wincred.exe"
문제가 없다면 해당 명령 수행 이후 정상적으로 push가 추가적인 비밀번호 없이도 가능해진다.
만약 잘 안된다면 해당 경로에 git-credential-wincred.exe가 실제로 있는지 확인하고, 만약 없다면 직접 설치 이후, 설치된 위치의 credential-manager를 활용하는 방식으로 해결이 가능할 것 같다.