gh auth login 브라우저 인증 문제와 SSH 설정
Issue
섹션 제목: “Issue”gh auth login에서 one-time code를 입력하고 GitHub CLI 접근을 승인했지만 브라우저의 Confirm access 화면에서 더 진행되지 않았다.
터미널에서도 인증 절차가 끝나지 않았다. 일반 브라우저 대신 시크릿 모드에서 https://github.com/login/device 을 열어 같은 코드를 입력하니 인증을 완료할 수 있었다.
Cause
섹션 제목: “Cause”정확한 원인은 확인하지 못했다.
- 일반 브라우저에서는 인증이 완료되지 않았다.
- 같은 one-time code를 시크릿 모드에서 입력하자 인증에 성공했다.
기존 로그인 세션, 쿠키 또는 브라우저 확장 프로그램의 영향을 받았을 가능성은 있지만, 확인하지 않은 원인을 브라우저 문제로 단정할 수는 없다.
또한 GitHub CLI의 로그인 방식과 Git 저장소의 통신 프로토콜은 구분해야 한다.
gh는 브라우저 OAuth로 인증하면서 Git clone과 push에는 SSH를 사용할 수 있다.
Resolution
섹션 제목: “Resolution”1) 시크릿 모드에서 다시 인증
섹션 제목: “1) 시크릿 모드에서 다시 인증”터미널에서 로그인을 다시 시작했다.
gh auth login대화형 항목은 다음과 같이 선택했다.
? What account do you want to log into?> GitHub.com
? What is your preferred protocol for Git operations on this host?> SSH
? How would you like to authenticate GitHub CLI?> Login with a web browser터미널에 표시된 one-time code를 복사하고, 시크릿 모드에서 아래 페이지를 직접 열어 입력했다.
https://github.com/login/device이번에는 기기 연결 완료 화면으로 정상적으로 넘어갔다.
터미널에서 로그인 상태를 확인했다.
gh auth status2) GitHub CLI의 Git protocol을 SSH로 설정
섹션 제목: “2) GitHub CLI의 Git protocol을 SSH로 설정”로그인할 때 HTTPS를 선택했거나 나중에 설정을 바꾸려면 다음 명령을 사용한다.
gh config set git_protocol ssh --host github.com여기서 host는 GitHub 계정이나 Repository 이름이 아니라 접속할 GitHub 서버의 도메인을 의미한다.
개인 사용자가 일반적으로 접속하는 공개 GitHub의 host는 github.com이다. 반면 회사가 GitHub Enterprise Server를 자체 도메인으로 운영한다면 github.company.com이나 git.example.com 같은 별도 host를 사용할 수 있다. 도메인은 회사 환경에 따라 다르다.
예를 들어 공개 GitHub와 회사의 GitHub Enterprise Server를 함께 사용한다면 각각 다른 Git protocol을 지정할 수 있다.
# 공개 GitHub는 SSH 사용gh config set git_protocol ssh --host github.com
# 회사 GitHub Enterprise Server는 HTTPS 사용gh config set git_protocol https --host github.company.com두 명령의 차이는 다음과 같다.
gh config set git_protocol ssh --host github.com은github.com에만 적용되는 호스트별 설정이다.gh config set git_protocol ssh은 특정 host를 지정하지 않은 전역 기본 설정이다.
gh auth login에서 선택한 Git protocol은 로그인한 host의 설정으로 저장되며, 이 호스트별 설정은 전역 기본값보다 우선한다. 로그인 과정에서 github.com의 protocol을 HTTPS로 선택했다면 --host 없이 전역 기본값만 SSH로 변경해도 github.com에는 기존 HTTPS 설정이 계속 적용될 수 있다.
공개 GitHub만 사용하는 일반 사용자에게 다른 host가 필요한 것은 아니다. 다만 로그인할 때 만들어진 github.com 설정을 정확히 변경하려면 --host github.com을 붙이는 편이 명확하다.
설정값은 다음 명령으로 확인할 수 있다.
gh config get git_protocol --host github.com이 설정은 gh가 GitHub 저장소를 clone하거나 push할 때 사용할 프로토콜을 지정한다. SSH를 선택하면 기존 SSH key를 찾고, key가 없으면 생성 및 업로드 여부를 묻는 과정이 나타날 수 있다.
3) 기존 저장소의 remote URL 확인
섹션 제목: “3) 기존 저장소의 remote URL 확인”gh의 git_protocol 설정을 바꿔도 이미 clone한 저장소의 remote URL은 자동으로 바뀌지 않는다. 현재 저장소가 SSH와 HTTPS 중 무엇을 사용하는지는 git remote -v로 확인한다.
git remote -vSSH remote는 다음과 같은 형태다.
origin git@github.com:OWNER/REPOSITORY.git (fetch)origin git@github.com:OWNER/REPOSITORY.git (push)HTTPS remote는 다음과 같은 형태다.
origin https://github.com/OWNER/REPOSITORY.git (fetch)origin https://github.com/OWNER/REPOSITORY.git (push)기존 저장소도 SSH로 바꾸려면 remote URL을 직접 변경한다.
git remote set-url origin git@github.com:OWNER/REPOSITORY.gitgit remote -vNotes
섹션 제목: “Notes”gh auth login의 기본 인증 흐름은 브라우저 기반이며, 완료 후gh auth status로 상태를 확인할 수 있다.gh config set git_protocol ssh --host github.com은 GitHub CLI가 사용할 Git protocol을 설정한다.- 기존 저장소의 실제 통신 방식은
gh config가 아니라git remote -v의 URL로 확인한다. - 시크릿 모드에서 성공했다는 결과만 확인했으며, 일반 브라우저에서 실패한 원인은 특정하지 못했다.
- 참고 문서: GitHub CLI
gh auth login, GitHub CLIgh config set