JWT와 JWT는 비슷해 보이지만 완전히 다른 개념이에요. 이름이 비슷해서 혼동하기 쉽죠.
JWK란?
- 정의: JWK는 JSON Web Key의 약자로, 암호화 키를 JSON 형식으로 표현한 표준입니다. 주로 암호화나 복호화에 사용되는 키를 구조화된 방식으로 나타낼 때 쓰입니다.
- 용도: 웹에서 암호화 작업(예: 데이터 암호화, 서명 검증)을 할 때, 키를 쉽게 저장하거나 전달하기 위해 만들어졌어요. Exclidraw의 예시처럼, AES-GCM 같은 암호화 알고리즘에서 사용하는 키를 표현할 때 유용하죠.
- 구성: JWK는 JSON 객체로 되어 있고, 키의 종류나 속성을 정의하는 필드가 있어요, 예를 들어:
{ "kty": "oct", // 키 타입 (oct는 대칭키를 뜻함) "k": "abc123", // 실제 키 값 (base64로 인코딩된 문자열) "alg": "A128GCM", // 사용할 알고리즘 "ext": true, // 키를 내보낼 수 있는지 여부 "key_ops": ["encrypt", "decrypt"] // 키로 할 수 있는 작업 }
- 특징: JWK는 키 자체를 나타내는 데이터 구조일 뿐, 인증이나 권한 같은 추가 기능은 없어요.
JWT란?
- 정의: JWT는 JSON Web Token의 약자로, JSON 형식으로 된 토큰을 만들어서 인증이나 정보 전달에 사용하는 기술입니다.
- 용도: 주로 로그인이나 권한 확인에 쓰여요. 예를 들어, 사용자가 로그인하면 서버가 JWT를 발급해서 “이 사람은 인증된 사용자야”라는 정보를 클라이언트에 주고, 이후 요청마다 이 토큰을 확인하는 식이에요.
- 구성: JWT는 .으로 구분된 세 부분으로 나뉩니다:
- Header: 토큰의 타입과 알고리즘 정보 (예: {”alg”: “HS265”, “typ”: “JWT”})
- Payload: 전달할 데이터 (예: {”user_id”:”123”, “role”:”admin”})
- Signature: Header와 Payload를 키로 서명한 값(위조 방지용)
- 예: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiMTIzIn0.서명값
- 특징: JWT는 데이터를 담고 서명을 통해 신뢰성을 보장하지만, 기본적으로 암호화는 안 해요(암호화하려면 별도 처리가 필요)
JWK와 JWT의 차이
항목 | JWK (JSON Web Key) | JWT (JSON Web Token) |
목적 | 암호화 키를 표현 | 인증/정보 전달용 토큰 |
내용 | 키의 속성 (예: 키 값, 알고리즘) | 데이터 + 서명 (예: 사용자 정보) |
사용 예 | Excalidraw에서 데이터 암호화 | 로그인 세션 관리 |
암호화 여부 | 키 자체는 암호화 역할 | 기본적으로 암호화 안 함 |
형태 | JSON 객체 | Base64로 인코딩된 문자열 |
쉽게 말하면:
- JWK는 "열쇠"를 나타내는 설계도예요. 그 열쇠로 문(데이터)을 잠그거나 열 수 있죠.
- JWT는 "편지" 같은 거예요. 내용(데이터)과 함께 "이건 내가 쓴 거 맞아"라는 서명이 붙어 있어요.
Excalidraw에서 JWK는 뭘까?
Excalidraw의 코드에서 JWK는 암호화 키를 URL에 넣기 위해 사용됐어요:
- exportKey("jwk", key): 브라우저가 만든 암호화 키를 JWK 형식으로 내보내서, k 필드에 있는 base64 문자열(예: "abc123")을 URL에 붙임.
- importKey("jwk", ...): 다운받을 때 URL에서 가져온 키 문자열을 다시 JWK 객체로 만들어 복호화에 사용.
즉, Excalidraw에서 JWK는 키를 간편하게 저장하고 전달하는 "도구" 역할을 합니다. JWT와는 전혀 관련 없어요!
결론
- JWK는 암호화 키를 JSON으로 표현한 거예요. Excalidraw에서 데이터를 암호화하고 풀 때 키를 다루는 데 쓰였죠.
- JWT는 인증용 토큰이고, JWK와는 목적도 다르고 구조도 달라요. 이름만 비슷할 뿐입니다.