[CS]대칭키와 비대칭키 + JWK #1

장준혁·2024년 5월 27일

computer science

목록 보기
11/11
post-thumbnail

직무 면접을 보는 자리에서 JWK라는 단어에 대해서 처음 들어봤다.

JWK(Json Web Key)는 JSON을 형태로 암호화키를 나타내는 데이터 구조 이다.

JWK를 공부하던 도중 문득 기존 개념인 대칭키와 비대칭키에 대해서 한번 더 정리 해보자는 생각이 들었다.

🔑 대칭키

A가 B에게 전달할 문서가 존재하고 문서 자체로 B에게 전달하는 방식을 사용한다고 가정해보자.

문서에 어떠한 조치도 하지않고 B에게 전달하기 때문에 중간에 악성 유저가 문서를 탈취 또는 열람 한다면 이후 상황에 악 영향을 끼칠 것 이다.

애초에 탈취 당하지 않는다면 좋겠지만 탈취 당하더라도 악성유저가 문서를 열람하지 못했으면 하는 바람이 생긴다.

이때 문서를 암호화 해서 전달 하는 방식이 바로 대칭키 방식이며 하나의 Key로 문서를 암호화 해서 전달하기 때문에 해당 키의 소유자가 아니라면 문서를 복호화 할 수 없다.

하지만 여기서도 이상한 부분이 존재한다.

문서를 암,복호화 할때 동일한 Key를 사용하기 때문에 A가 문서를 암호화 해서 전달한다면 B가 복호화 하기 위해 Key를 보유 해야한다.

A가 문서를 암,복호화할 Key를 가지고 있다면 B에게 Key를 전달하는 과정이 필요할 것이다.

Key를 전달하는 과정에서 악성유저가 열람 또는 탈취 한다면 B에 Key가 전달 되더라도 문제가 발생한다.


문서가 암호화 되어 전달하더라도 악성유저의 입장에서는 암호화 된 문서를 복호화 할 수 있기에 문제없이 열람이 가능하다.

위와 같은 상황 때문에 문제는 원점으로 다시 되돌아간다.

🔑 비대칭키

문서는 암호화 하여 전달할 수 있지만 Key를 전달하는 과정에서 안정성을 보장받지 못하는 대칭키의 문제점을 살펴보았다.

비대칭키 방식은 각 사용자들이 각자의 암,복호화 키를 따로 가지는 것이다.

각 사용자들은 암호화 할수 있는 Key를 모두가 사용할 수 있도록 공개해 버린다.

그렇다면 A가 B에게 전달한 문서가 있을때 어떻게 해야할까?


A는 B가 공개해놓은 B의 Encrypt용 공개키로 전달한 자신의 문서를 암호화 한다.

B의 공개키로 암호화된 A의 문서는 B의 Decrypt Key 즉 복호화 Key가 아니라면 복호화가 불가능 하다.

B의 공개키로 암호화된 문서는 탈취 당하더라도 악성유저가 B의 복호화 키는 알 수 없기에 문서내용은 알 수 없다.

대칭키와 달리 문서를 암호화 할 key를 개인이 소유하고 전달 필요가 없기에 탈취당할 위험이 적다.

🔑 JWK (Json Web Key)

암호화 키를 표현하기 위한 JSON 객체에 관한 표준이다.

대칭키 또는 비대칭키를 JSON의 형태로 표현하는 방식이며 작동원리 자체는 동일하다.

JWT를 생성하거나 검증하는데 사용되는 공개키 또는 비공개 키를 JWK화 해서 사용할 수 있다.

Key에 JWK를 적용하여 사용할 경우 Public으로 공개되는 Encrypt 용 Key를 JSON 형태로 배포 한다면 JWK라고 명칭할 수 있는 것이다.


{
  "keys": [
    {
      "alg": "RS256",         // 알고리즘 종류 (예: RS256)
      "e": "AQAB",            // RSA public exponent
      "kid": "2011-04-29",    // Key ID
      "kty": "RSA",           // Key Type (RSA)
      "n": "0vx7agoebGcQSuuPiLJXZptN27ctQ...", // RSA modulus
      "use": "sig"            // Public Key Use (예: "sig" -> signature, "enc" -> encryption)
    }
  ]
}

🤔 정리

JWK에 대해서 간략하게 알아보았다.

이 외에도 JWK 관련 지식들에 대해 공부 하고 구현 하기 위해 여러가지 생각을 개인적으로 진행 한 후Spring boot에서 아래와 같은 상황을 구현 할 것이다.

상황은 비대칭키 작동방식을 사용한다고 가정한다.

예전 프로젝트와 연관지어서 JWK로 공개키를 표현하고 JWK로 데이터를 암호화 한다음 서버로 전달 해보자. (Client)

암호화된 데이터를 전달받은 서버에서는 개인 키로 암호화된 문서를 복호화 해서 사용해보자. (Server)

profile
wkd86591247@gmail.com

0개의 댓글