OpenSSL 명령어를 실행하는 것이 지겨워서 JWK 생성을 위한 CLI를 만들었습니다
Source: Dev.to
소개
개발자만이 느낄 수 있는 일종의 좌절감이 있습니다. 비교적 간단한 작업을 해야 하는데, 도구가 여러 수동 단계와 매번 구글링해야 하는 터미널 명령어, 그리고 형식이 맞는지 확신할 수 없는 출력 파일을 강요할 때 말이죠.
문제점
키를 JWK (JSON Web Key) 형식으로 제공해야 하는 서비스와 통합하고 있었습니다. PEM 형식이 아니라요.
OpenSSL을 사용해 키 쌍을 생성하는 방법은 이미 알고 있었습니다:
# Generate a private EC key
openssl ecparam -name prime256v1 -genkey -noout -out private.pem
# Derive the public key
openssl ec -in private.pem -pubout -out public.pem
하지만 그 PEM 파일들을 JWK로 변환하는 일은 번거로웠습니다. 일회성 Node.js 스크립트를 작성해 JWK 객체를 수동으로 만들고, kty, crv, x, y, d 필드를 두 번 확인한 뒤 출력을 저장했죠. 동작은 했지만, 이 과정을 반복해야 한다는 걸 알고 있었습니다.
해결책: jwk-cli-tool
저는 **jwk-cli-tool**이라는 인터랙티브 CLI를 만들었습니다. 전체 워크플로를 한 번에 처리합니다:
- 새로운 PEM 키 쌍(EC 또는 RSA) 생성
- PEM 파일을 JWK JSON 형식으로 변환
- 두 단계를 하나의 흐름으로 수행
이 도구는 네 개의 파일을 생성합니다:
*.private.pem*.public.pem*.private.jwk.json*.public.jwk.json
지원 알고리즘
| 유형 | 알고리즘 |
|---|---|
| EC | ES256, ES384, ES512 |
| RSA | RS256, RS384, RS512 |
설치 및 사용법
설치는 필요 없습니다. npx로 도구를 실행하세요:
npx jwk-cli-tool
인터랙티브 메뉴가 표시됩니다:
? What would you like to do?
> Generate new PEM key pair
Generate JWK JSON files
Exit
여기서 할 수 있는 일:
- 키 이름 지정
- 알고리즘 선택
keys폴더에 있는 기존 파일을 사용할지, 새 PEM 파일을 생성할지 선택
생성된 파일은 다음 위치에 저장됩니다:
keys/– PEM 파일용outputs/– JWK JSON 파일용
두 디렉터리는 존재하지 않을 경우 자동으로 생성됩니다. 동일한 키 이름이 이미 존재하면, CLI가 덮어쓰기 전에 확인을 요청합니다.
예시 출력
ES256 키에 대한 흐름을 실행하면 다음과 같은 공개 JWK가 생성됩니다:
{
"kty": "EC",
"use": "sig",
"alg": "ES256",
"kid": "myapp",
"crv": "P-256",
"x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
"y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
}
개인 JWK는 위 필드에 d 파라미터가 추가된 형태입니다.
구현 세부 사항
- Node.js와 TypeScript로 구축
- 텍스트 기반 UI를 위해
@inquirer/prompts사용 - 외부 암호화 의존성을 최소화하기 위해 Node 내장
crypto모듈 활용
도구는 process.cwd()에 파일을 기록하므로, npx jwk-cli-tool을 실행하는 디렉터리 어디에서든 keys/와 outputs/ 폴더가 해당 위치에 생성됩니다.
오픈 소스
- GitHub:
- npm:
기여
Pull request와 피드백을 환영합니다. 추가 알고리즘이나 기능(예: EdDSA/Ed25519, JWKS 배열 출력, CI 파이프라인용 비인터랙티브 모드)이 필요하면 이슈를 열어 주세요.
때때로 최고의 도구는 스스로의 문제를 해결하면서 탄생합니다. 이 도구가 다른 사람에게도 OpenSSL을 구글링하느라 쓰는 30분을 절약해 주길 바랍니다.