1Password 없이 macOS 커맨드라인에서 TOTP 사용하기

Command line TOTP on OSX w/o 1password

작성자
발행일
2025년 06월 10일

핵심 요약

  • 1 1Password 구독 모델 및 Electron 앱 의존성에서 벗어나기 위해 macOS 커맨드라인 기반의 TOTP 솔루션을 구축합니다.
  • 2 totp-cli, age, age-plugin-se를 활용하여 Touch ID(Secure Enclave)로 암호화된 TOTP 코드를 안전하게 생성하는 방법을 상세히 안내합니다.
  • 3 새로운 시스템은 1Password 대비 현저히 적은 시스템 리소스를 사용하며 월별 구독료를 절감하는 경제적 이점을 제공합니다.

도입

본 문서는 macOS 환경에서 1Password와 같은 구독형 OTP(일회용 비밀번호) 관리 솔루션의 대안으로, 커맨드라인 기반의 오픈소스 도구를 활용하여 TOTP(시분할 일회용 비밀번호)를 생성하는 방법을 다룹니다. 필자는 Rubygems 배포 시 OTP 사용이 의무화된 이후 1Password의 커맨드라인 인터페이스를 사용해왔으나, 구독 모델과 Electron 기반 앱의 시스템 자원 소모에 대한 불만으로 대안을 모색하게 되었습니다. Apple의 기본 보안 도구는 OTP 코드 질의 기능을 제공하지 않으므로, Touch ID 또는 시스템 암호를 통해 OTP를 생성하는 자체 시스템 구축 방안을 제시합니다.

본 시스템을 구축하기 위한 핵심 의존성 및 설정, 사용법은 다음과 같습니다.

의존성

  • totp-cli: TOTP 키 저장 및 자격 증명 생성을 담당합니다.

  • age: totp-cli 암호를 암호화하고 복호화하는 데 사용됩니다.

  • age-plugin-se: Apple의 Secure Enclave(Touch ID)를 age에서 활용할 수 있도록 지원합니다.

이 모든 도구는 Homebrew를 통해 쉽게 설치할 수 있습니다. macOS가 아닌 환경에서는 YubiKey 등 다른 age 플러그인을 활용할 수 있습니다.

설정 단계

  1. totp-cli 암호 생성: Apple Password.app 등 암호 관리자에서 totp-cli용 고유 암호(예: YYYYYY)를 생성하고 저장합니다.

  2. Rubygems OTP 항목 추가: 다음 명령어를 사용하여 totp-cli에 Rubygems OTP 항목을 추가합니다. Rubygems.org에서 제공하는 토큰(XXXXXX)과 위에서 생성한 totp-cli 암호(YYYYYY)를 입력합니다. bash totp-cli add totp rubygems.org 주의: Rubygems.org의 UI 문제로 인해 토큰을 얻기 위해 인증 앱을 비활성화했다가 다시 활성화해야 할 수 있습니다. 또한, 이 TOTP 코드와 Rubygems 복구 코드를 암호 관리자에 함께 저장하여 cmdline과 암호 관리자의 OTP가 동기화되도록 유지해야 합니다.

  3. 암호화 키 생성: age-plugin-se를 사용하여 암호화 키를 생성합니다. 이 키는 Secure Enclave를 활용하여 암호화/복호화에 사용됩니다. bash age-plugin-se keygen -o ~/.age.key chmod 600 ~/.age.key

  4. totp-cli 암호 암호화: totp-cli 암호(YYYYYY)를 age를 사용하여 암호화하고, 암호화된 파일을 ~/.totp.rubygems.age로 저장합니다. 이 과정에서 ~/.age.key 파일에서 공개 키를 추출하여 사용합니다. bash echo YYYYYY | age -r $(awk '/public key:/ {print $4}' ~/.age.key) -o ~/.totp.rubygems.age 참고: 명령어 앞에 공백을 추가하면 셸 기록에서 제외될 수 있지만, ps 명령으로는 여전히 노출될 수 있으므로 다중 사용자 시스템에서는 주의가 필요합니다.

사용법

  1. OTP 생성 테스트: totp-cli generate totp rubygems.org 명령 실행 후 totp-cli 암호를 입력하여 6자리 OTP 코드를 확인합니다.

  2. 암호 복호화 테스트: age -d -i ~/.age.key ~/.totp.rubygems.age 명령을 실행하여 Touch ID 또는 사용자 암호를 통해 암호화된 암호가 올바르게 복호화되는지 확인합니다.

  3. 자동화 스크립트 구축: 위 두 과정을 통합하여 OTP를 자동으로 생성하는 실행 가능한 스크립트(예: otp_rubygems)를 작성합니다. bash #!/bin/bash export TOTP_PASS=$(age -d -i ~/.age.key ~/.totp.rubygems.age) totp-cli generate totp rubygems.org 이 스크립트는 age를 통해 TOTP 암호를 복호화한 후, 환경 변수를 통해 totp-cli에 전달하여 OTP를 생성합니다.

  4. Rubygems 배포 통합: 필자는 이 스크립트를 Hoe 설정에 연동하여 rake release 실행 시 GEM_HOST_OTP_CODE=$(otp_rubygems) 환경 변수를 자동으로 설정하도록 하였습니다. 이를 통해 gem push 명령이 자동으로 OTP를 사용하게 됩니다. 다음 릴리스 시 Touch ID 또는 사용자 암호 프롬프트가 표시되면, 인증 후 자동으로 젬이 게시됩니다.

결론

이러한 시스템 구축을 통해 1Password와 같은 Electron 기반 앱의 제거로 인한 상당한 시스템 리소스 절감 효과를 얻을 수 있습니다. 1Password 앱이 421MB(총 564MB)를 차지하는 반면, 새로 구축된 `age` 및 `totp-cli` 관련 파일들은 총 약 10MB에 불과합니다. 이는 불필요한 월별 구독료 지출을 없애는 부가적인 이점과 함께, 더욱 효율적이고 안전하며 커맨드라인 친화적인 TOTP 관리 워크플로우를 제공합니다. 이 방법은 Rubygems 외 다른 비밀 코드가 필요한 모든 시스템에 적용 가능합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!