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에 적용하는 과정을 단계별로 살펴보도록 하겠습니다.
Understanding GPG Key Basics
GPG(GNU Privacy Guard)는 1997년에 개발된 오픈 소스 암호화 도구로, 데이터 보안을 위해 널리 사용됩니다. GPG는 PGP(Pretty Good Privacy)를 기반으로 하며, 혼합 암호화 방식(Hybrid Encryption)을 활용해 데이터를 안전하게 암호화하고, 디지털 서명을 통해 데이터의 무결성과 발신자를 확인할 수 있습니다. 이 방식은 비대칭 암호화를 사용해 대칭 키를 안전하게 교환하고, 대칭 암호화를 통해 데이터를 효율적으로 보호합니다.
GPG는 GNU 프로젝트의 일환으로 개발되었으며, 누구나 자유롭게 사용하고 수정할 수 있도록 설계된 소프트웨어입니다. 이러한 오픈 소스 철학은 보편적 접근성과 투명성을 보장하며, 전 세계적으로 신뢰받는 데이터 보안 도구로 자리 잡게 했습니다.
GNU 프로젝트
GNU는 "GNU's Not Unix"의 줄임말로, Unix와 비슷하지만 완전히 자유로운 소프트웨어를 목표로 하는 프로젝트입니다. 이름은 동물 누(Gnu)에서 영감을 받았으며, 누가 자연에서 자유롭게 뛰어노는 모습이 GNU 프로젝트가 추구하는 소프트웨어의 자유를 상징합니다. GNU의 로고에도 누의 얼굴이 포함되어 있습니다. GNU는 한글로 "그누"라고 발음합니다.
Public Key Algorithms in GPG
GPG 키를 생성할 때는 RSA, DSA, ECC 등 다양한 공개 키 알고리즘이 있습니다. 각 알고리즘은 보안 수준과 성능에 차이가 있으므로, 사용 목적에 맞는 알고리즘을 선택해야 합니다.
- RSA(Rivest-Shamir-Adleman): 가장 널리 사용되는 알고리즘으로, 공개 키(Public Key)와 개인 키(Private Key)의 쌍을 생성하여 데이터 암호화와 서명 검증에 사용됩니다. 일반적으로 2048비트 또는 4096비트 키 길이를 사용하며, 키 길이가 길수록 보안성이 높아집니다.
- DSA(Digital Signature Algorithm): 디지털 서명에 특화된 알고리즘으로, 주로 SHA(Secure Hash Algorithm)와 함께 사용됩니다.
- ECC(Elliptic Curve Cryptography): RSA에 비해 짧은 키 길이로 유사한 보안 수준을 제공하며, 특히 모바일 기기와 IoT 장치가 널리 사용되는 현대 환경에서 높은 효율성을 발휘합니다. 대표적으로 Curve25519와 같은 곡선이 자주 활용됩니다.
Cryptographic Algorithms for Key Generation and Data Protection
GPG 키 생성 과정과 데이터 보호에는 다음과 같은 다양한 암호화 기술이 사용됩니다:
- Cipher Algorithms: AES, AES256, TWOFISH, BLOWFISH, CAMELLIA 등 다양한 알고리즘이 지원되며, 데이터의 기밀성을 보호합니다.
- Hash Algorithms: SHA256, SHA512, RIPEMD160 등 데이터 무결성을 확인하고, 서명을 효율적으로 생성하기 위해 사용됩니다.
- Compression Algorithms: ZIP, ZLIB, BZIP2 등을 활용하여 데이터 전송 및 저장의 효율성을 높입니다.
- Passphrase: GPG 키는 공개 키 암호 방식의 특성상 개인 키를 절대 노출하지 않도록 설계되어 있으며, 키 생성 시 사용자가 직접 설정하는 강력한 비밀번호(Passphrase)를 통해 보안을 강화합니다.
Use Cases of GPG
GPG는 데이터 보안과 신뢰성을 보장하기 위해 다양한 분야에서 활용되고 있습니다. 다음은 GPG의 대표적인 사용 사례입니다:
- 소프트웨어 배포: 소프트웨어 배포 시 GPG를 활용해 코드의 무결성을 검증하고, 악의적인 수정이나 위변조를 방지합니다.
- 버전 관리 시스템: Git과 같은 버전 관리 시스템에서 GPG 서명을 통해 커밋이나 태그의 작성자를 인증하고, 기록의 신뢰성을 보장합니다.
- 이메일 보안: GPG를 사용해 이메일 내용을 암호화하고, 디지털 서명으로 발신자의 신원을 증명합니다. 이를 통해 중간 공격을 방지하며, 이메일의 무결성을 안전하게 유지할 수 있습니다.
- 서버 간 통신 보안: 서버 간 데이터 전송 시 GPG 암호화를 적용해 도청과 변조를 방지하고, 중간자 공격을 차단하여 안전한 통신 환경을 제공합니다.
- 문서 인증 및 전자 서명: 계약서나 보고서와 같은 문서에 디지털 서명을 추가해 문서의 진위를 보장하고, 무결성과 신뢰성을 유지합니다.
- 인증서 관리: 데이터 보호를 위한 인증서 발급, 갱신, 관리를 지원하여 보안 체계를 강화합니다.
이처럼 GPG는 데이터의 무결성, 기밀성, 인증을 보장하는 다양한 기능을 제공하며, 이를 통해 개발자와 보안 전문가들에게 필수적인 도구로 자리 잡고 있습니다.
Generating a GPG Key on macOS
이전 섹션에서 GPG 키의 개념과 다양한 활용 사례를 알아보았습니다. 이제 macOS 환경에서 GPG 키를 생성하는 과정을 단계별로 진행해 보겠습니다.
Installing GPG Key Generation Utility
macOS에서는 패키지 관리 도구인 Homebrew를 사용하여 간편하게 GPG를 설치할 수 있습니다.
1. Install GnuPG using Homebrew
터미널에서 다음 명령어를 실행하여 GPG를 설치합니다:
$ brew install gnupg
GPG vs. GnuPG
GPG는 GnuPG의 줄임말로, 일반적으로 GPG로 불리는 이유는 명령어가 GPG로 사용되기 때문인 것으로 보입니다. 또한, OpenPGP 표준을 기반으로 하고 있어 비슷한 이름 패턴이 적용된 것으로 이해할 수 있습니다.
2. Verify the installation
설치가 완료되면, GnuPG가 정상적으로 동작하는지 확인하기 위해 버전을 확인합니다:
$ gpg --version
gpg (GnuPG) 2.4.7
libgcrypt 1.11.0
Copyright (C) 2024 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: /Users/catsriding/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
Generating a New GPG key
GnuPG를 사용하여 macOS에서 새로운 GPG 키를 생성하는 과정은 다음과 같은 단계로 진행됩니다:
1. Start the key generation process
다음 명령어를 실행하여 GPG 키 생성 프로세스를 시작합니다:
$ gpg --full-generate-key
2. Select the key type
프롬프트가 표시되면 생성할 키 유형을 선택합니다. 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. Specify the key size
RSA 키의 크기를 설정합니다. 보안을 강화하기 위해 4096비트 크기를 권장합니다:
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
4. Define the key expiration
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
5. Provide user information
필수 사용자 정보를 입력합니다. 이름과 이메일 주소는 키의 소유자를 식별하는 데 사용되며, 필요하면 키의 역할이나 목적에 대한 코멘트를 추가할 수 있습니다:
Real name: Jynn 🐈
Email address: catsriding@gmail.com
Comment: Made with 💖 by Jynn 🐈, featuring Ongs and Mongs 🐾
- Real name: Git 커밋 작성자 이름으로 표시됩니다. 이름은 서명된 커밋과 연결되며, 다른 사람들이 작성자를 식별하는 데 사용됩니다.
- Email: Git 커밋에 표시되는 이메일 주소입니다. 커밋과 연결되어 작성자의 신원을 나타냅니다.
- Comment: GPG 키에 추가적인 설명이나 주석을 입력할 수 있는 선택적 필드입니다. 이 필드는 주로 키를 더 잘 구분하거나 설명을 제공하기 위해 사용됩니다. 입력하지 않아도 되고, 필요한 경우에만 추가하는 것이 일반적입니다.
6. Confirm your input
입력한 정보를 확인합니다. 필요하면 이전 단계로 돌아가 수정할 수 있으며, 모두 올바르게 선택했다면 O
를 입력해 다음 단계로 넘어갑니다:
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
7. Set Passphrase
GPG 키 생성 과정의 마지막 설정 단계로, 개인 키를 보호하기 위한 패스프레이즈(Passphrase)를 설정하는 과정입니다. 웹 서비스 계정의 비밀번호와 같이, GPG 개인 키를 사용할 때마다 입력해야 하는 중요한 보안 요소입니다.
┌─────────────────────────────────────────────────────────────┐
│ Please enter the passphrase to │
│ protect your new key │
│ │
│ Passphrases match. │
│ │
│ Passphrase: _______________________________________________ │
│ │
│ Repeat: ___________________________________________________ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ <OK> <Cancel> │
└─────────────────────────────────────────────────────────────┘
8. Wait for the key generation process
모든 설정 단계는 완료되었고, 이제 기다리면 됩니다. 다만, 키 생성 과정에서 충분한 난수를 생성하기 위해 키보드 입력이나 마우스 움직임 등의 작업이 필요할 수 있습니다.
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 Jynn 🐈 (Made with 💖 by Jynn 🐈, featuring Ongs and Mongs 🐾) <catsriding@gmail.com>
sub rsa4096 2025-01-15 [E]
9. Verify the generated key
마지막으로, 생성된 키 목록을 확인하여 프로세스가 성공적으로 완료되었는지 확인합니다:
$ 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] Jynn 🐈 (Made with 💖 by Jynn 🐈, featuring Ongs and Mongs 🐾) <catsriding@gmail.com>
ssb rsa4096/D0************* 2025-01-15 [E]
이러한 과정을 통해 GPG 키가 성공적으로 생성되었으며, 이제 활용할 준비가 되었습니다.
Linking Your GPG Key with Git and GitHub
Git은 기본적으로 이메일 주소를 사용해 커밋 작성자를 식별합니다. 하지만 이메일 주소만으로는 다른 사람이 해당 주소를 도용해 커밋을 작성할 수 있는 잠재적 위험이 있습니다. 이러한 문제를 방지하고 커밋의 신뢰성을 보장하기 위해, 커밋 서명을 추가하는 것이 권장됩니다. 서명을 추가하는 대표적인 방법으로 GPG 키를 연동하는 방식이 있습니다. 이제 앞에서 생성한 GPG 키를 GitHub 계정에 연동하는 과정을 진행해 보겠습니다.
Activating GPG Signing to Git
Git에서 커밋 서명을 활성화하면, 각 커밋에 대한 신뢰성을 보장할 수 있습니다. 이를 위해 GPG 서명을 커밋에 추가하는 방법을 단계별로 진행해보겠습니다.
1. Installing Pinentry Mac on macOS
GPG 서명을 사용할 때 패스프레이즈 입력 프롬프트가 정상적으로 표시되지 않을 가능성이 있습니다. 이를 방지하기 위해 Pinentry Mac을 설치하는 것이 좋습니다. Pinentry Mac은 터미널에서 암호(passphrase) 입력을 원활하게 처리하는 도구로, macOS 환경에서 다양한 암호 입력 요청을 지원합니다. 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
2. Verifying Passphrase Entry
Pinentry Mac이 정상적으로 설정되었는지 확인하려면, 아래 명령어를 실행하여 패스프레이즈 입력 팝업이 뜨는지 확인합니다:
$ echo "testing GPG Signing" | gpg --clearsign
gpg --clearsign
: 입력된 메시지를 해싱한 후, 해당 해시 값에 대해 GPG 서명을 생성하여 서명 블록을 추가합니다.
패스프레이즈 입력 창이 나타나면 정상적으로 설정된 것입니다. Pinentry Mac은 애플 Keychain을 지원하므로 패스프레이즈를 저장하면 다음번 입력 시 자동으로 사용됩니다.
패스프레이즈를 입력하고 검증을 통과하면, 입력한 메시지를 기반으로 생성된 GPG 서명이 포함된 출력을 확인할 수 있습니다:
$ echo "testing gpg signing" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
testing gpg signing
-----BEGIN PGP SIGNATURE-----
iQI*************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
-----END PGP SIGNATURE-----
이제 GPG 키가 정상적으로 작동하는 것을 확인했으므로, Git에 연동하여 커밋 서명을 설정할 수 있습니다.
3. Configuring Git Settings
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] Jynn 🐈 (Made with 💖 by Jynn 🐈, 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 = Jynn 🐈
4 │ signingkey = 3FE********************
5 │ [commit]
6 │ gpgSign = true
7 │ [tag]
8 │ forceSignAnnotated = false
9 │ [gpg]
10 │ format = openpgp
11 │ program = /opt/homebrew/bin/gpg
───────┴───────────────────────────────────────────────────────────────
4. Verifying GPG Signing for Git Commits
설정이 완료되었으면, 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 "Jynn 🐈 (Made with 💖 by Jynn 🐈, featuring Ongs and Mongs 🐾) <catsriding@gmail.com>" [ultimate]
Author: Jynn 🐈 <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과 올바르게 연결되었는지 다시 확인해야 합니다.
GPG Key Integration with GitHub
Git에서 GPG 서명을 설정했으므로, 이제 GitHub 계정과 연동하여 커밋 서명을 검증할 수 있도록 해야 합니다. 이를 통해 GitHub에서 커밋이 신뢰할 수 있는 출처인지 확인할 수 있습니다. 다음 단계에서는 GPG 공개 키를 추출하고 GitHub에 등록하는 과정을 진행하겠습니다.
1. Extracting Public Key
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-----"
까지 모든 내용을 포함해야 합니다.
2. Adding Public Key to GitHub
그다음, GitHub에 로그인한 하여 Account Settings ▸ SSH and GPG keys 페이지로 이동한 후 New GPG key
버튼을 클릭합니다.
새로운 GPG 키 등록 화면에 복사한 공개 키를 입력란에 붙여넣고, Add GPG Key
버튼을 클릭합니다.
GitHub 계정에 이중 인증이 설정되어 있다면, 다음 화면에서 인증 과정을 완료해야 합니다.
GPG 키 등록이 완료되면, 아래와 같이 GPG Keys 목록에 표시됩니다:
3. Verifying Signed Commits on GitHub
작업 중인 리포지토리의 커밋 히스토리 페이지에 접속하면, 해당 계정으로 작업한 커밋 내역에 Verified
뱃지가 추가된 것을 확인할 수 있습니다. 이를 통해 GPG 키가 GitHub에 성공적으로 연동되었음을 확인할 수 있습니다.
이렇게 GitHub에 GPG 키가 성공적으로 연동되었습니다. 저는 Git GUI 툴인 GitKraken을 사용하고 있는데, 이러한 툴들은 자체적으로 GPG 키 생성 기능을 제공할 수 있으니 확인해보면 좋을것 같습니다. 🦑
Wrapping Up Git and GPG Key Integration
지금까지 GPG에 대해 알아보고 키를 생성하여 GitHub에 연동하는 작업을 단계적으로 진행해 보았습니다. GPG 키는 Git 커밋과 태그에 서명을 추가해 신뢰성을 강화할 뿐만 아니라, 계정 도용을 방지하는 데도 중요한 역할을 합니다. 이제부터 Verified 서명이 달린 커밋으로 프로젝트에 기여해 보세요! 🚀
- Git
- GitHub