GPG 키 생성 및 GitHub 계정에 연동하기

Generating a GPG Key and Adding to Your GitHub Account
GPG(GNU Privacy Guard)는 데이터를 암호화하고 디지털 서명을 통해 무결성을 보장하는 오픈소스 암호화 도구로, 안전한 데이터 보호와 신뢰성 있는 인증을 제공하며, 다양한 환경에서 활용되고 있습니다.
개발에 필수적인 버전 관리 도구인 Git은 이메일 주소로 커밋 작성자를 식별하기 때문에 도용 위험이 있어, GitHub 및 다른 버전 관리 시스템에서는 서명을 추가하여 보안을 강화할 것을 권장합니다. 특히, GitHub는 GPG 키 생성 시 사용한 이메일 주소가 계정에 등록된 이메일 주소와 일치하는 경우, 서명이 포함된 커밋에 Verified
뱃지를 표시하여 해당 커밋이 신뢰할 수 있는 작성자에 의해 생성되었음을 명확히 나타냅니다.
GitHub의 프라이빗 리포지토리는 공동 작업자로 등록된 사용자만 접근할 수 있어 기본적인 보안이 보장되지만, 외부 협력 업체와의 공유나 오픈소스 프로젝트와 같이 더 많은 사용자와 협업하는 경우 GPG 서명은 커밋 도용 방지와 무결성을 유지하는 데 유용합니다. 이를 통해 프로젝트의 신뢰성을 높이고, 협업 환경에서 발생할 수 있는 혼란을 줄일 수 있습니다.
이 글에서는 GPG에 대해 간략히 알아보고, 이어서 macOS 환경에서 GPG 키를 생성하여 GitHub에 적용하는 과정을 단계별로 살펴보도록 하겠습니다.
1. GPG 키의 개념과 기본 원리
GPG(GNU Privacy Guard)는 데이터를 암호화하고 디지털 서명을 통해 무결성과 신원을 보장하는 오픈 소스 도구입니다. PGP(Pretty Good Privacy) 표준을 기반으로 하며, 비대칭키 암호화와 대칭키 암호화를 결합한 하이브리드 방식으로 작동합니다. 즉, 안전하게 키를 교환하고 빠르게 데이터를 보호할 수 있는 구조입니다.
1997년 GNU 프로젝트의 일환으로 시작된 GPG는 누구나 무료로 사용할 수 있으며, 투명한 구현 덕분에 오랜 기간 보안 커뮤니티의 신뢰를 받아 왔습니다.
1-1. GPG 키를 구성하는 주요 알고리즘
GPG 키를 생성할 때는 다음과 같은 알고리즘이 사용됩니다:
- 공개키 암호화: 데이터를 암호화하거나 디지털 서명을 생성할 때 사용됩니다.
RSA
: 범용성과 안정성에서 널리 사용됨ECC
: RSA보다 짧은 키로도 높은 보안을 제공하여 최근 선호됨
- 대칭키 암호화: 실제 데이터 암호화에는 연산 효율이 높은 AES와 같은 대칭 알고리즘이 사용됩니다.
- 해시 알고리즘: 데이터 무결성 확인과 서명 생성에 사용됩니다.
- 압축 및 패스프레이즈 보호: 저장 및 전송 효율을 높이기 위한 압축 알고리즘, 키 보호를 위한 비밀번호 설정도 함께 적용됩니다.
이러한 조합을 통해 생성된 GPG 키는 개인 키와 공개 키 한 쌍으로 구성되며, 다양한 환경에서 안전한 인증과 암호화를 지원합니다.
1-2. GPG 키의 활용 예시
GPG는 단순한 암호화 도구를 넘어 실무 보안에 폭넓게 활용됩니다:
- 커밋 서명: Git 커밋 또는 태그에 서명을 추가해 작성자 위조를 방지하고, GitHub 등에서
Verified
배지를 부여받을 수 있습니다. - 소프트웨어 무결성 보장: 릴리스 파일에 서명해 배포물의 신뢰성을 검증할 수 있습니다.
- 이메일 암호화: 민감한 이메일 내용을 암호화하고, 발신자의 신원을 증명하는 데 사용됩니다.
- 서버 간 안전한 통신: 인증된 키를 통해 중간자 공격을 방지할 수 있습니다.
이처럼 GPG는 신뢰 기반 협업, 배포, 인증이 요구되는 다양한 개발 환경에서 필수적인 역할을 수행합니다.
2. GPG 유틸리티 설치하기
앞서 GPG 키의 개념과 활용 사례를 살펴보았습니다. 이제 macOS 환경에서 GPG 키를 생성하기 위해 필요한 도구들을 설치해보겠습니다.
2-1. GPG 키 생성 도구 설치
macOS에서는 Homebrew를 통해 GPG를 간편하게 설치할 수 있습니다.
터미널에서 아래 명령어를 실행하여 gnupg
패키지를 설치합니다:
$ brew install gnupg
설치가 완료되면 다음 명령어로 버전을 확인하여 GPG가 제대로 동작하는지 점검합니다:
$ gpg --version
gpg (GnuPG) 2.4.7
libgcrypt 1.11.0
...
2-2. macOS에 Pinentry 설치
GPG는 서명 시 패스프레이즈 입력이 필요합니다. 하지만 macOS 환경에서는 입력 창이 나타나지 않는 경우가 종종 있어, 이를 해결하려면 Pinentry Mac을 설치하는 것이 좋습니다.
Homebrew로 다음 명령어를 실행해 설치합니다:
$ brew install pinentry-mac
설치가 끝나면, GPG 에이전트가 pinentry-mac
을 사용하도록 설정 파일을 수정합니다:
$ echo "pinentry-program /opt/homebrew/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
변경 사항을 적용하기 위해 GPG 에이전트를 재시작합니다:
$ gpgconf --kill gpg-agent
$ gpgconf --launch gpg-agent
정상 작동을 확인하려면 아래 명령어를 실행해 패스프레이즈 입력 팝업이 뜨는지 확인해보세요:
$ echo "testing GPG Signing" | gpg --clearsign
gpg --clearsign
: 메시지를 해시 처리한 뒤 서명을 추가합니다.
입력 창이 정상적으로 나타난다면 설정이 완료된 것입니다. Pinentry Mac은 macOS의 Keychain과 연동되어 패스프레이즈를 저장하고 자동 입력할 수도 있습니다.

패스프레이즈를 입력하고 나면, 입력한 메시지에 서명이 포함된 결과를 확인할 수 있습니다:
$ echo "testing gpg signing" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
testing gpg signing
-----BEGIN PGP SIGNATURE-----
iQI*************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
-----END PGP SIGNATURE-----
3. GPG 키 생성하기
GnuPG를 사용하여 macOS에서 새로운 GPG 키를 생성하는 과정은 다음과 같은 단계로 진행됩니다:
3-1. GPG 키 생성 프로세스 시작
다음 명령어를 실행하여 GPG 키 생성 프로세스를 시작합니다:
$ gpg --full-generate-key
3-2. 키 유형 선택
프롬프트가 표시되면 생성할 키 유형을 선택합니다. RSA는 오랜 기간 널리 사용되어 안정성과 신뢰성이 검증된 암호화 방식으로, 웹 서비스와 디지털 서명 등 다양한 분야에서 활용되어 왔습니다. 하지만 긴 키 길이로 인해 연산 속도가 느리고, 키 관리가 복잡할 수 있다는 단점이 있습니다. 반면, 기본값으로 설정된 ECC는 짧은 키 길이로 비슷한 보안 수준을 제공하면서도 효율성이 뛰어납니다. 현대에 들어 컴퓨팅 환경이 모바일 기기와 IoT 장치로 확장되면서, 자원이 제한된 환경에서의 사용이 대폭 증가하고 있는 추세입니다. 두 방식 모두 신뢰할 만한 선택이므로, 필요와 환경에 맞게 적합한 방식을 선택하면 됩니다. 저는 여기서 RSA를 선택하고 다음 단계로 넘어가겠습니다.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection? 1
3-3. 키 길이 설정
RSA 키의 크기를 설정합니다. 보안을 강화하기 위해 4096비트 크기를 권장합니다:
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
3-4. 키 만료 기한 설정
GPG 키의 유효 기간을 설정합니다. 만료 기한 없이 영구적으로 사용하려면 0
을 입력하세요.
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
3-5. 사용자 정보 입력
필수 사용자 정보를 입력합니다. 이름과 이메일 주소는 키의 소유자를 식별하는 데 사용되며, 필요하면 키의 역할이나 목적에 대한 코멘트를 추가할 수 있습니다:
Real name: Jin 🐈
Email address: catsriding@gmail.com
Comment: Made with 💖 by Jin 🐈, featuring Ongs and Mongs 🐾
- Real name: Git 커밋 작성자 이름으로 표시됩니다. 이름은 서명된 커밋과 연결되며, 다른 사람들이 작성자를 식별하는 데 사용됩니다.
- Email: Git 커밋에 표시되는 이메일 주소입니다. 커밋과 연결되어 작성자의 신원을 나타냅니다.
- Comment: GPG 키에 추가적인 설명이나 주석을 입력할 수 있는 선택적 필드입니다. 이 필드는 주로 키를 더 잘 구분하거나 설명을 제공하기 위해 사용됩니다. 입력하지 않아도 되고, 필요한 경우에만 추가하는 것이 일반적입니다.
3-6. 입력 정보 확인
입력한 정보를 확인합니다. 필요하면 이전 단계로 돌아가 수정할 수 있으며, 모두 올바르게 선택했다면 O
를 입력해 다음 단계로 넘어갑니다:
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
3-7. 패스프레이즈 설정
GPG 키 생성 과정의 마지막 설정 단계로, 개인 키를 보호하기 위한 패스프레이즈(Passphrase)를 설정하는 과정입니다. 웹 서비스 계정의 비밀번호와 같이, GPG 개인 키를 사용할 때마다 입력해야 하는 중요한 보안 요소입니다.
┌─────────────────────────────────────────────────────────────┐
│ Please enter the passphrase to │
│ protect your new key │
│ │
│ Passphrases match. │
│ │
│ Passphrase: _______________________________________________ │
│ │
│ Repeat: ___________________________________________________ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ <OK> <Cancel> │
└─────────────────────────────────────────────────────────────┘
3-8. 키 생성 완료 대기
모든 설정 단계는 완료되었고, 이제 기다리면 됩니다. 다만, 키 생성 과정에서 충분한 난수를 생성하기 위해 키보드 입력이나 마우스 움직임 등의 작업이 필요할 수 있습니다.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: /Users/catsriding/.gnupg/trustdb.gpg: trustdb created
gpg: directory '/Users/catsriding/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/Users/catsriding/.gnupg/openpgp-revocs.d/3FE********************.rev'
public and secret key created and signed.
pub rsa4096 2025-01-15 [SC]
3FE********************
uid Jin 🐈 (Made with 💖 by Jinn 🐈, featuring Ongs and Mongs 🐾) <catsriding@gmail.com>
sub rsa4096 2025-01-15 [E]
3-9. 생성된 키 확인
마지막으로, 생성된 키 목록을 확인하여 프로세스가 성공적으로 완료되었는지 확인합니다:
$ gpg --list-secret-keys --keyid-format LONG
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
[keyboxd]
---------
sec rsa4096/22F************ 2025-01-15 [SC]
3FE********************
uid [ultimate] Jin 🐈 (Made with 💖 by Jin 🐈, featuring Ongs and Mongs 🐾) <catsriding@gmail.com>
ssb rsa4096/D0************* 2025-01-15 [E]
이러한 과정을 통해 GPG 키가 성공적으로 생성되었으며, 이제 활용할 준비가 되었습니다.
4. GPG 키를 Git과 GitHub에 연동하기
Git은 기본적으로 이메일 주소를 사용해 커밋 작성자를 식별합니다. 하지만 이메일 주소만으로는 다른 사람이 해당 주소를 도용해 커밋을 작성할 수 있는 잠재적 위험이 있습니다. 이러한 문제를 방지하고 커밋의 신뢰성을 보장하기 위해, 커밋 서명을 추가하는 것이 권장됩니다. 서명을 추가하는 대표적인 방법으로 GPG 키를 연동하는 방식이 있습니다. 이제 앞에서 생성한 GPG 키를 GitHub 계정에 연동하는 과정을 진행해 보겠습니다.
4-1. Git 커밋 서명 활성화
Git에서 커밋 서명을 활성화하면, 각 커밋에 대한 신뢰성을 보장할 수 있습니다. 이를 위해 GPG 서명을 커밋에 추가하는 방법을 단계별로 진행해보겠습니다.
Git 커밋 시 -S
옵션을 사용하면 GPG 서명을 직접 추가할 수 있지만, 매번 지정하는 것은 번거로울 수 있습니다. 이런 불편함을 줄이기 위해 Git 설정에 GPG 키를 추가하여 커밋 시 자동으로 서명이 적용되도록 구성하겠습니다.
먼저, 현재 시스템에 저장된 GPG 개인 키 목록을 확인하여 GPG 키의 ID 값을 확인합니다:
$ gpg --list-secret-keys
출력된 정보에서 sec
로 표시된 항목에서 GPG 키 ID를 확인할 수 있습니다. 예를 들어, 다음과 같은 출력이 나타날 수 있습니다:
[keyboxd]
---------
sec rsa4096 2025-01-15 [SC]
3FE******************** # GPG_KEY_ID
uid [ultimate] Jin 🐈 (Made with 💖 by Jin 🐈, featuring Ongs and Mongs 🐾) <catsriding@gmail.com>
ssb rsa4096 2025-01-15 [E]
위의 3FE********************
가 GPG 키 ID이며, 이를 Git에 등록해야 합니다. 다음 명령어를 실행하여 Git 글로벌 설정에 GPG 키를 추가합니다:
$ git config --global user.signingkey <GPG_KEY_ID> # 기본 GPG 서명 키 설정
$ git config --global commit.gpgsign true # 모든 커밋에 GPG 서명 자동 적용
$ git config --global gpg.program $(which gpg) # 사용할 GPG 프로그램 지정
이제 Git의 모든 커밋에 대해 자동으로 서명이 추가될 것입니다. 설정이 제대로 적용되었는지 확인하려면 Git 설정 파일을 열어 확인할 수 있습니다:
$ cat ~/.gitconfig
───────┬───────────────────────────────────────────────────────────────
│ File: /Users/catsriding/.gitconfig
───────┼───────────────────────────────────────────────────────────────
1 │ [user]
2 │ email = catsriding@gmail.com
3 │ name = Jin 🐈
4 │ signingkey = 3FE********************
5 │ [commit]
6 │ gpgSign = true
7 │ [tag]
8 │ forceSignAnnotated = false
9 │ [gpg]
10 │ format = openpgp
11 │ program = /opt/homebrew/bin/gpg
───────┴───────────────────────────────────────────────────────────────
설정이 완료되었으면, Git 커밋에 GPG 서명이 올바르게 적용되는지 확인해 보겠습니다. 이를 위해 간단한 테스트 커밋을 생성한 후, 서명이 정상적으로 포함되었는지 확인합니다.
먼저, 테스트를 위해 임의의 파일을 만들고, 새로운 커밋을 생성합니다:
$ echo "Testing GPG signing" > hello-gpg.md
$ git add hello-gpg.md
$ git commit -m "🧪 test: test gpg signing"
[waves 419354a] 🧪 test: test gpg signing
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hello-gpg.md
그런 다음, 커밋 로그에서 서명 정보가 올바르게 포함되었는지 확인합니다:
$ git log --show-signature -n 1
commit 419354ae2214e517dfe321df6ea256dda3e8e370 (HEAD -> waves)
gpg: Signature made Thu Jan 15 21:03:10 2025 KST
gpg: using RSA key 3FE********************
gpg: Good signature from "Jin 🐈 (Made with 💖 by Jin 🐈, featuring Ongs and Mongs 🐾) <catsriding@gmail.com>" [ultimate]
Author: Jin 🐈 <catsriding@gmail.com>
Date: Thu Jan 15 21:03:10 2025 +0900
🧪 test: test gpg signing
출력 결과에서 Good signature from
메시지가 표시되면, GPG 서명이 정상적으로 적용된 것입니다. 만약 BAD signature
또는 No signature
와 같은 오류가 발생한다면, 앞서 설정한 GPG 키가 Git과 올바르게 연결되었는지 다시 확인해야 합니다.
4-2. GitHub에 GPG 키 등록하기
Git에서 GPG 서명을 설정했으므로, 이제 GitHub 계정과 연동하여 커밋 서명을 검증할 수 있도록 해야 합니다. 이를 통해 GitHub에서 커밋이 신뢰할 수 있는 출처인지 확인할 수 있습니다.
GitHub에 등록할 GPG 공개 키를 가져오기 위해 다음 명령어를 실행합니다. 여기에서 <GPG_KEY_ID>
에는 이전 단계에서 확인한 GPG 키 ID를 입력하면 됩니다:
$ gpg --armor --export <GPG_KEY_ID>
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQI*************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
...
-----END PGP PUBLIC KEY BLOCK-----
위 출력된 공개 키를 복사합니다. "-----BEGIN PGP PUBLIC KEY BLOCK-----"
부터 "-----END PGP PUBLIC KEY BLOCK-----"
까지 모든 내용을 포함해야 합니다.
그다음, GitHub에 로그인한 하여 Account Settings ▸ SSH and GPG keys 페이지로 이동한 후 New GPG key
버튼을 클릭합니다.

새로운 GPG 키 등록 화면에 복사한 공개 키를 입력란에 붙여넣고, Add GPG Key
버튼을 클릭합니다.

GitHub 계정에 이중 인증이 설정되어 있다면, 다음 화면에서 인증 과정을 완료해야 합니다.

GPG 키 등록이 완료되면, 아래와 같이 GPG Keys 목록에 표시됩니다:

작업 중인 리포지토리의 커밋 히스토리 페이지에 접속하면, 해당 계정으로 작업한 커밋 내역에 Verified
뱃지가 추가된 것을 확인할 수 있습니다. 이를 통해 GPG 키가 GitHub에 성공적으로 연동되었음을 확인할 수 있습니다.

이렇게 GitHub에 GPG 키가 성공적으로 연동되었습니다. 저는 Git GUI 툴인 GitKraken을 사용하고 있는데, 이러한 툴들은 자체적으로 GPG 키 생성 기능을 제공할 수 있으니 확인해보면 좋을것 같습니다. 🦑

5. 정리하며
지금까지 GPG에 대해 알아보고 키를 생성하여 GitHub에 연동하는 작업을 단계적으로 진행해 보았습니다. GPG 키는 Git 커밋과 태그에 서명을 추가해 신뢰성을 강화할 뿐만 아니라, 계정 도용을 방지하는 데도 중요한 역할을 합니다. 이제부터 Verified 서명이 달린 커밋으로 프로젝트에 기여해 보세요! 🚀