최근 ChatGPT와 GitHub를 연결해서 저장소를 읽고, 수정하고, 커밋까지 이어지는 개발 환경을 구성하고 있었다.
작업 중인 저장소는 개인 프로젝트인 chat2post.
calh7958/chat2post
ChatGPT에서는 저장소도 잘 읽혔고, 저장소 권한을 확인해 봐도 이상이 없어 보였다.
admin: true
push: true
pull: true
그런데 이상하게 실제 쓰기 작업만 하면 전부 실패했다.
branch 생성 → 403
ref 업데이트 → 403
파일 수정 → 403
처음에는 ChatGPT의 권한 설정이나 GitHub의 브랜치 보호 설정 문제라고 생각했다.
하지만 원인은 전혀 다른 곳에 있었다.
GitHub 연결 상태를 하나씩 확인하다가 이상한 점을 발견했다.
현재 ChatGPT에서 인증된 GitHub 사용자는 분명 내 개인 계정이었다.
Authenticated GitHub user
→ calh7958
그런데 ChatGPT에서 실제 Write 작업에 사용되는 GitHub App installation 정보를 확인해 보니 다른 GitHub 계정이 연결되어 있었다.
처음에는 이 계정이 왜 연결되어 있는지 바로 기억나지 않았다.
조금 생각해 보니 대학 시절 팀프로젝트를 진행하면서 팀장의 GitHub 계정이나 저장소를 사용했던 적이 있었고, 그 과정에서 ChatGPT/Codex 관련 GitHub 연결이 팀장의 계정에 설치된 채 남아 있었던 것으로 보였다.
즉 현재 상태는 대략 이렇게 꼬여 있었다.
현재 내 GitHub 사용자 인증
→ calh7958
과거 GitHub App installation
→ 대학 시절 팀프로젝트에서 사용했던 팀장 계정
더 결정적인 것은 해당 GitHub App에서 접근 가능한 저장소를 확인했을 때였다.
내가 현재 작업하고 있는
calh7958/chat2post
가 아니라 예전에 사용했던 다른 프로젝트 저장소만 등록되어 있었다.
그제야 왜 읽기는 되는데 쓰기만 실패하는지 이해할 수 있었다.
여기서 가장 헷갈렸던 부분이 있다.
ChatGPT는 분명 chat2post 저장소를 읽을 수 있었다.
그래서 나는 자연스럽게
GitHub 연결 정상
= Read / Write 모두 정상
이라고 생각했다.
하지만 GitHub 연결에는 서로 다른 두 가지 개념이 있었다.
GitHub 사용자 인증
Authorized GitHub App
GitHub 저장소 접근 권한
Installed GitHub App
내 상태는 이런 식이었다.
Authorized GitHub App
→ 내 계정(calh7958) ✅
Installed GitHub App
→ 과거 팀프로젝트 계정 ❌
즉 사용자가 누구인지는 현재 내 계정으로 정상 인증되어 있었지만, 실제 Repository에 쓰기 작업을 수행하는 GitHub App installation은 과거 다른 계정에 붙어 있었던 것이다.
결과적으로 이런 묘한 상태가 만들어졌다.
Repository 읽기 → 가능
Repository 정보 조회 → 가능
push: true 표시 → 정상
하지만
branch 생성 → 403
file 수정 → 403
ref update → 403
처음에는 ChatGPT에서 GitHub 연결을 끊고 다시 연결하면 끝날 줄 알았다.
ChatGPT
→ Settings
→ GitHub Disconnect
GitHub 로그아웃
→ 내 계정으로 다시 로그인
ChatGPT
→ GitHub Connect
그런데 다시 연결해도 GitHub에서
어느 계정에 설치할지
어느 Repository를 사용할지
묻는 화면이 나오지 않았다.
그냥 바로 연결 완료가 되었다.
GitHub의 설정을 다시 확인해 보니 내 계정의 Installed GitHub Apps에도 ChatGPT 관련 Connector가 없었다.
즉, 다시 로그인한 것은 사용자 인증만 다시 한 것이고 GitHub App installation 자체를 새로 설치한 것은 아니었다.
결국 GitHub App 설치 페이지를 통해 Connector 자체를 내 GitHub 계정에 직접 설치했다.
설치 대상은 현재 사용하는 개인 계정으로 선택했다.
Install on
→ calh7958
그리고 Repository access에 현재 프로젝트를 포함시켰다.
Repository access
→ chat2post
설치 후 다시 GitHub 설정에 들어갔다.
GitHub
→ Settings
→ Applications
→ Installed GitHub Apps
이번에는 정상적으로
ChatGPT Codex Connector
가 표시됐다.
이제 구조가 제대로 맞춰졌다.
GitHub 사용자 인증
→ calh7958
GitHub App installation
→ calh7958
Repository
→ calh7958/chat2post
설치만 보고 끝내면 찜찜하니 실제 GitHub Write 작업도 테스트했다.
우선 테스트 브랜치를 생성했다.
chatgpt-write-test
성공.
기존에는 이 단계에서 바로 403 Forbidden이 발생했었다.
다음으로 테스트 파일을 생성했다.
chatgpt-write-test.txt
내용은 간단하게:
ChatGPT GitHub write test
결과적으로 실제 GitHub Commit까지 정상적으로 생성됐다.
13fa14eed42b4859645cef502da0a16326feb39a
생성된 파일을 다시 읽어보는 것까지 성공했다.
ChatGPT
→ GitHub Connector
→ chat2post
→ branch 생성
→ 파일 생성
→ commit
전체 경로가 정상 동작하는 것을 확인했다.
테스트가 끝난 후에는 테스트 파일도 다시 삭제했고, 삭제 역시 Commit으로 정상 반영됐다.
이번 문제는 단순히 Contents Write 권한이 없다 정도의 문제가 아니었다.
진짜 원인은 과거 대학 팀프로젝트 과정에서 사용했던 GitHub 계정의 App installation이 ChatGPT 연결에 남아 있었던 것이었다.
정리하면 처음에는:
현재 GitHub 사용자
→ calh7958
GitHub App installation
→ 과거 팀프로젝트에서 사용했던 팀장 계정
현재 Repository
→ calh7958/chat2post
였다.
세 요소가 서로 맞지 않았다.
수정 후에는:
GitHub 사용자
→ calh7958
GitHub App installation
→ calh7958
Repository
→ calh7958/chat2post
로 통일됐다.
그 결과 기존의
branch 생성 → 403
파일 수정 → 403
ref update → 403
가 모두 해결됐다.
이번 일을 겪으면서 예전에 사용했던 계정 연결도 생각보다 오래 남을 수 있다는 것을 알게 됐다.
특히 나처럼
학교 팀프로젝트
개인 프로젝트
회사/교육 프로젝트
개인 GitHub 계정
팀원의 GitHub 계정
등을 오가면서 작업했다면 GitHub App installation이 어느 계정에 붙어 있는지 한 번쯤 확인해 보는 게 좋다.
중요한 것은 단순히
현재 어떤 GitHub 계정으로 로그인했는가?
만 확인하는 게 아니다.
실제로는 다음 세 가지가 모두 일치해야 한다.
특히 Repository는 읽히는데 쓰기 작업만 전부 403으로 실패한다면, GitHub App installation 계정을 확인해 볼 가치가 크다.
처음에는 단순한 GitHub 권한 오류라고 생각했다.
그런데 확인할수록 문제는 코드도, 브랜치 설정도, ChatGPT의 Allow all actions 설정도 아니었다.
몇 년 전 대학 팀프로젝트를 하며 다른 계정과 연결했던 흔적이 남아 있었고, 그 GitHub App installation이 지금까지 사용되고 있었던 것이 원인이었다.
전체 과정을 압축하면 이렇다.
ChatGPT GitHub Write 실패
↓
403 Forbidden 확인
↓
Repository 권한 확인
↓
push: true인데도 실패
↓
GitHub App installation 확인
↓
과거 팀프로젝트 계정 발견
↓
내 GitHub 계정에
ChatGPT Codex Connector 새로 설치
↓
chat2post Repository 연결
↓
branch 생성 성공
↓
파일 생성 + commit 성공
↓
GitHub Write 연결 정상화
이번 문제 덕분에 GitHub의 사용자 인증(Authentication) 과 GitHub App 설치(Installation) 가 서로 다른 개념이라는 것도 제대로 이해하게 됐다.
이제는 ChatGPT에서 프로젝트 저장소를 읽는 것뿐 아니라 브랜치 생성, 파일 수정, Commit까지 정상적으로 이어지는 것을 확인했다.
그리고 무엇보다,
예전에 다른 사람의 계정으로 진행했던 팀프로젝트가 있다면, 현재 GitHub App이 어디에 설치되어 있는지 한 번 확인해 보자.
403의 원인이 몇 년 전 팀프로젝트일 수도 있다.
원래 여러 서비스에서는 calu를 사용하고 있었는데, GitHub만 예전에 오타가 들어간 calh 상태로 쓰고 있었다. 이번 GitHub Connector 이슈를 해결하면서 아예 GitHub username도 calu7958로 통일했다.