JWK ↔ PEM 변환기
인증 제공자는 서명 키를 JWKS로 공개합니다. base64url 숫자로 가득한 JSON 문서죠. 그런데 토큰을 검증하는 라이브러리는 대부분 PEM을 원합니다. 같은 키를 전혀 다른 모양으로 기술하는 두 형식이라, 필요 이상으로 자주 손으로 다리를 놓게 됩니다. 이 도구는 양방향으로 변환합니다. JWK, JWKS 전체, 또는 하나 이상의 PEM 공개키를 붙여넣으면 각 키가 반대 형식으로 나오고, 그 키가 실제로 무엇인지도 함께 보여줍니다. 키 종류, RSA 길이나 타원곡선, 키가 선언한 알고리즘과 용도, 그리고 RFC 7638 thumbprint까지요. thumbprint는 어떤 필드가 함께 실려 있든 상관없이 키 자체를 식별하는 정규화된 지문입니다. 변환은 ASN.1을 손으로 조립하는 대신 브라우저의 WebCrypto 구현이 직접 수행합니다. 브라우저에서 서명을 검증하는 바로 그 코드가 만들어낸 바이트라는 뜻입니다. 업로드되는 것은 없고, 붙여넣은 JWK에 개인키 요소가 들어 있으면 다른 처리를 하기 전에 먼저 제거하고 그 사실을 알려줍니다.
공개키만 넣으세요. 개인키 요소는 읽기 전에 제거되며 업로드되는 것은 없습니다.
JWK, JWKS 또는 PEM 공개키를 붙여넣으면 변환됩니다.
사용법
- JWK, JWKS 문서, 또는 PEM 공개키를 붙여넣으세요.
- 키 종류, 길이나 곡선, 선언된 알고리즘을 확인하세요.
- PEM이 필요한 라이브러리에는 PEM을, JWKS에는 JWK를 복사해 쓰세요.
- 두 사본이 정말 같은 키인지 확인할 땐 thumbprint를 비교하세요.
- PEM 블록을 여러 개 붙여넣으면 한 번에 변환됩니다.
자주 묻는 질문
- RFC 7638 thumbprint가 뭔가요?
- 키를 정의하는 필수 요소만 담은 정규화된 JSON에 SHA-256을 적용한 값입니다. RSA라면 e, kty, n을 그 순서로, 공백 없이 담습니다. 나머지가 모두 제외되기 때문에, 한쪽에는 kid·alg·use가 있고 다른 쪽에는 없어도 같은 키라면 같은 thumbprint가 나옵니다.
- thumbprint와 kid는 같은 건가요?
- 꼭 그렇지는 않습니다. kid는 발급자가 그 키를 부르기로 정한 이름일 뿐이고 무엇이든 될 수 있습니다. 많은 발급자가 RFC 7638 thumbprint를 kid로 쓰기 때문에 자주 일치하지만, 그래야 한다는 규정은 없습니다.
- 개인키도 변환할 수 있나요?
- 아니요. 붙여넣은 JWK에 개인키 요소가 있으면 키를 읽기 전에 제거하고 공개키만 변환합니다. 어느 쪽이든 업로드되지는 않지만, 개인키는 웹 페이지에 넣을 것이 아닙니다.
- 어떤 키 종류를 지원하나요?
- RSA와 NIST 곡선 P-256, P-384, P-521, 그리고 브라우저가 지원하는 경우 Ed25519입니다. WebCrypto가 구현하지 않는 곡선(예: secp256k1)은 여기서 변환할 수 없습니다.
- 변환된 JWK에 alg가 왜 없나요?
- PEM에는 alg가 들어 있지 않기 때문입니다. 키를 읽으려면 가져오기 단계에서 알고리즘을 지정해야 하는데, 결과에 alg를 남기면 그건 키가 말한 값이 아니라 이 도구의 가정이 됩니다. 그래서 제거합니다.
- 키가 업로드되나요?
- 아니요. 변환은 브라우저 내장 WebCrypto로 이뤄지고 서버로 전송되는 것은 없습니다.
관련 도구
Base64 ↔ 16진수 변환기
Base64 문자열을 16진수 바이트로, 16진수를 다시 Base64로 변환합니다. URL-safe 지원, 브라우저에서 동작합니다.
JWT 디코더
JWT의 헤더·클레임·만료를 즉시 확인하세요.
JWT 생성기
헤더·페이로드에서 HS256/HS384/HS512 JWT를 만들고 서명 — JWT 디코더와 짝.
Punycode 변환기
국제화 도메인을 Unicode(`münchen.de`)와 Punycode ASCII(`xn--mnchen-3ya.de`) 간 변환.
Base45 인코더 및 디코더
RFC 9285에 따라 텍스트를 Base45로 인코딩하고 Base45를 다시 텍스트로 디코딩합니다. 브라우저에서 동작합니다.
Quoted-Printable 인코더 & 디코더
텍스트를 MIME Quoted-Printable(RFC 2045)로 인코딩하거나 다시 디코딩 — =XX 이스케이프·소프트 줄바꿈·UTF-8 처리, 인코딩 시 76자 줄바꿈 — 브라우저에서.