Mac OS X 터미널에서 Git 패스워드 기억하기

분산 버전 관리 시스템 Git을 쓸 때 터미널에서 CLI로 작업하는 경우, HTTPS 프로토콜을 사용하면 매번 인증을 하는 불편함이 있는데, 인증 정보를 기억하게 해서 이 문제를 해결해 보겠습니다.

Git 네트워크 프로토콜

Git이 리모트 저장소와 통신하는데 쓰는 네트워크 프로토콜은 GIT, SSH, HTTPS 방식이 있습니다.

  • Git
  • SSH
  • HTTP/S

이 중 Git 기본 프로토콜은 인증 기능이 미약해 거의 쓰지 않고, SSH나 HTTPS를 많이 씁니다. HTTP 프로토콜 방식이 비효율적이었던 예전에는, SSH 프로토콜로 인증하는 방식이 많이 쓰였지만, Git의 버전이 올라가면서 HTTP 위에서도 SSH 프로토콜처럼 효율적으로 통신하는 Smart-HTTP 프로토콜이 구현된 이래 HTTP/S 프로토콜을 더 많이 쓰는 것 같습니다.

아무래도 SSH에서 쓰는 RSA키를 별도 등록해서 쓰기에 다소 번거롭다는 점, 아이디/패스워드 인증이 친숙한 면도 있다는 점, 그리고 경우에 따라 방화벽 환경등에서 HTTP/S로 연결하기가 편리한 경우도 있다는 점이 그 이유일 수 있겠습니다.

어떤 이유로든, 이제 GitHub에 접근할 때 HTTPS를 주로 쓰고 있는데요, 이때 패스워드를 기억하게 하려면, 두 가지 방법이 있습니다.

OSX 키체인을 이용하는 방법

위 박스 링크에 (영문으로) 잘 적혀있는데요, 요약해 정리하자면, 아래의 커맨드로 맥의 키체인을 사용해 인증하도록 할 수 있다는 내용입니다.

우선 credential-osxkeychain 헬퍼가 설치되어 있는지 확인합니다. 설치되어있지 않다면, 위 영문 문서의 내용을 참고해 설치하도록 합니다. 그다음 git 전역 설정으로 인증 처리에 osxkeychain을 쓰겠다고 지정합니다.

이렇게 해두면, OSX의 안전한 보안 정보 저장소인 키체인에 인증 정보를 보관하고 사용하게 됩니다. 이렇게 설정한 뒤, 최초로 인증이 필요한 github에 접근하면 아이디/패스워드를 입력하게 되고, 이 정보가 키체인에 보관됩니다. 이후부터는 github에 접근할 때, 이 키체인의 정보를 써서 자동으로 인증하게 됩니다.

이렇게 잘 쓰다가, github 계정의 패스워드를 바꾸거나, 아니면 (업무상) 다른 계정으로 로그인 해야한다면 어떻게 할까요? 그때는 키체인에 저장한 정보를 제거하고 새로 입력해야 합니다. 지우는 방법은 (1) 키체인 접근 애플리케이션에서 수동으로 해당 항목을 제거하거나, (2) credential-osxkeychain erase 명령어를 이용하면 됩니다.

키체인 접근의 github.com 암호 항목을 찾아 제거합니다.

credential-osxkeychain erase 명령어로 지우는 방법은 위 문서를 참고하세요.

2. 리눅스 환경에서도 쓰는 메모리 캐싱 방식

두번째 방법은, OSX 뿐만 아니라 *NIX 환경에서도 쓰는 방법입니다.

첫번째 방법과 마찬가지로 전역(global) 설정에 credential.helper를 지정하는데, 이번에는 cache로 지정합니다. 이 헬퍼는, 메모리에 인증 정보를 보관하며, 기본으로는 15분간 보관합니다. 5번째 줄에 있는 방식으로 옵션을 줘서 1시간(3,600초)이나 더 길게 설정할 수도 있습니다.

참고로, cache 인증 헬퍼는 git-credential-cache라는 데몬 프로세스가 구동되어, 해당 프로세스의 메모리에 인증 정보를 보관하고 제공합니다. 예전에 오래된 SVN처럼 평문으로 파일에 보관되는 것은 아니니 안심하세요. 더 자세한 내용은 아래 링크의 문서에서 참고하도록 합니다.

같은 도메인에 여러 아이디를 쓸 때의 문제

흔치는 않겠습니다만, GitHub같은 서비스를 프로젝트마다 다른 아이디로 로그인해야하는 경우가 있습니다. (제 경우, 개인용과 업무용 계정이 다릅니다.)

이럴 때, 아예 OSX의 로그인 계정을 분리해서 쓰면 가장 깔끔합니다만, 한 OSX 로그인 계정에서 프로젝트별로 다른 GitHub 계정을 쓴다면, 이제껏 정리한 패스워드 캐싱이 제대로 작동하지 않습니다. A프로젝트에서 작업해야하는데, B프로젝트에서 로그인했던 인증 정보가 캐싱되는 것이지요.

이럴 경우에는, 리모트 저장소 URL에 계정 정보를 포함하면 됩니다.

보통 git remote -v 로 확인해보면

origin https://github.com/hatemogi/project.git (fetch)
origin https://github.com/hatemogi/project.git (push)

위와 같이 origin 리모트 저장소 주소가 출력됩니다. 이 URL을 아래와 같이 변경해서 계정 정보도 포함 시키면, 마지막 문제도 해결됩니다.

git remote set-url origin https://hatemogi@github.com/hatemogi/project.git

다른 계정을 쓰는 프로젝트에서는 origin 주소에 다른 아이디를 지정하면 되겠지요.

이상으로, OSX에서 HTTP/S 프로토콜로 Git 리모트 저장소에 접근할 때, 패스워드를 캐싱하는 방법과, 캐싱하면서 여러 아이디를 쓸 때의 문제 해결 방법을 정리해 보았습니다.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.