인터넷에서는 데이터를 다른 사람이 읽지 못하도록 보호해야 할 때도 있고, 전달받은 데이터가 중간에 변경되지 않았는지 확인해야 할 때도 있다.
이런 문제를 해결하기 위해 Cryptography에서는 여러 종류의 Key와 Algorithm을 사용한다.
그중 비대칭키 방식에서는 서로 수학적으로 연결된 Public Key와 Private Key를 하나의 Key Pair로 사용한다.
두 Key 중 Private Key는 소유자만 비밀로 유지하고, Public Key는 다른 사람에게 공개할 수 있다.
이 Key Pair는 단순히 데이터를 암호화하는 데만 사용되는 것은 아니다.
대표적으로 다음 두 가지 문제를 해결하는 데 사용할 수 있다.
- Encryption — 허가되지 않은 사람이 데이터의 내용을 읽지 못하게 한다.
- Digital Signature — 데이터가 변경되지 않았고 특정 Private Key를 가진 주체가 서명했는지 검증한다.
같은 Public Key와 Private Key가 등장하지만 두 기술은 해결하려는 문제가 다르다.
이번 글에서는 대칭키와 비대칭키의 차이부터 Public Key와 Private Key의 역할, Encryption과 Digital Signature의 차이, 그리고 Signature가 데이터 변조를 어떻게 검증하는지 살펴본다.
목차
- 대칭키와 비대칭키는 Key를 사용하는 방식이 다르다
- Symmetric Cryptography
- Asymmetric Cryptography - Public Key와 Private Key는 하나의 Key Pair다
- Private Key
- Public Key - 암호화와 디지털 서명은 해결하려는 문제가 다르다
- Encryption
- Digital Signature - 디지털 서명은 Message와 Private Key를 연결한다
- Hash
- Signature 생성
- Signature 검증
- Public Key가 공개되어도 되는 이유 - Public Key를 가지고 있다고 그 주체를 바로 신뢰할 수 있는 것은 아니다
- Signature Verification과 Public Key Trust
- Public Key를 신뢰할 수 있게 전달하는 방법
1. 대칭키와 비대칭키는 Key를 사용하는 방식이 다르다
Cryptography에서 Key는 데이터를 보호하거나 Message의 무결성을 확인하는 등의 Cryptographic Operation에 사용된다.
Key를 사용하는 구조는 크게 Symmetric Cryptography와 Asymmetric Cryptography로 나눠볼 수 있다.
Symmetric Cryptography
대칭키 방식에서는 통신하는 주체가 같은 Secret Key를 공유한다.
예를 들어 데이터를 암호화한다고 하자.
- Plaintext → Secret Key로 Encryption → Ciphertext
- Ciphertext → 같은 Secret Key로 Decryption → Plaintext
암호화와 복호화에 필요한 Key가 동일하기 때문에 이 Secret Key는 외부에 노출되면 안 된다.
AES가 대표적인 대칭키 Encryption Algorithm이다.
또 같은 Secret을 공유하면서 Message의 무결성과 인증을 확인하는 HMAC(Hasa-based Message Authentication Code)도 있다.
Asymmetric Cryptography
비대칭키 방식에서는 하나의 Secret Key를 여러 주체가 공유하지 않는다.
대신 서로 수학적으로 연결된 두 개의 Key를 사용한다.
- Private Key
- Public Key
이 두 Key를 하나의 Key Pair라고 한다.
Private Key는 소유자가 비밀로 유지하고, Public Key는 다른 주체에게 공개할 수 있다.
Algorithm과 목적에 따라 이 Key Pair는 Encryption / Decryption, Digital Signature / Verification, Key Agreement 등에 사용할 수 있다.

| 구분 | Symmetric | Asymmetric |
| Key 구조 | 하나의 Shared Secret을 사용 | Public Key + Private Key Pair |
| Key 공개 | Secret을 공개하면 안 됨 | Public Key는 공개 가능, Private Key는 비밀 유지 |
| 대표적인 사용 | 데이터 암호화, HMAC | 암호화, Digital Signature, Key Agreement |
2. Public Key와 Private Key는 하나의 Key Pair다
Public Key와 Private Key는 서로 아무 관계가 없는 두 개의 임의 값이 아니다.
비대칭 Cryptography Algorithm에 따라 서로 수학적인 관계를 가지는 Key Pair로 생성된다.
다만 Public Key와 Private Key의 역할은 어떤 Cryptographic Operation에 사용하느냐에 따라 달라진다.
예를 들어 비대칭 Encryption에서는 수신자의 Public Key로 데이터를 암호화하고, 대응되는 Private Key로 복호화할 수 있다.
반면 Digital Signature에서는 Private Key로 Signature를 생성하고, 대응되는 Public Key로 이를 검증한다.
즉 같은 Key Pair를 사용하더라도 목적에 따라 다음과 같이 역할이 달라진다.
- Encryption → Public Key로 암호화 / Private Key로 복호화
- Digital Signature → Private Key로 서명 / Public Key로 검증
이 장에서는 먼저 Key 자체의 역할을 살펴보고, 다음 장에서 Encryption과 Digital Signature의 차이를 자세히 설명한다.
Private Key
Private Key는 Key Pair에서 비밀로 유지해야 하는 Key다.
Key Pair의 소유자만 가지고 있어야 하며 외부에 노출되면 안 된다.
- 비대칭 Encryption에서는 대응되는 Public Key로 암호화된 데이터를 복호화하는 데 Private Key를 사용할 수 있다.
- Digital Signature에서는 Private Key를 가진 주체만 정상적인 Signature를 생성할 수 있도록 사용한다.
- Private Key → 소유자만 보관 → Signature 생성
Public Key
Public Key는 다른 주체에게 공개할 수 있는 Key다.
- 비대칭 Encryption에서는 수신자의 Public Key를 이용해 해당 수신자만 복호화할 수 있는 데이터를 만들 수 있다.
- Digital Signature에서는 대응되는 Private Key로 만들어진 Signature를 검증하는 데 사용할 수 있다.
- Public Key → 다른 주체에게 공개 가능 → Signature 검증
Public Key를 알고 있다고 해서 대응되는 Private Key를 현실적인 시간 안에 계산할 수 있게 설계된 것은 아니다.
따라서 여러 사람이 Public Key를 가지고 Signature를 검증하거나 해당 Public Key를 대상으로 데이터를 암호화할 수 있어도,
Private Key를 가진 주체를 대신해 정상적인 Signature를 생성하거나 암호문을 복호화할 수 있는 것은 아니다.

3. 암호화와 디지털 서명은 해결하려는 문제가 다르다
Public Key와 Private Key를 이해할 때 가장 먼저 구분해야 하는 것은 Encryption과 Digital Signature가 각각 어떤 문제를 해결하는가다.
두 기술을 가장 단순하게 표현하면 다음과 같다.
Encryption: 이 내용을 누가 읽을 수 있는가?
Digital Signature: 이 데이터를 누가 서명했고, 이후 변경되지는 않았는가?
같은 Public Key와 Private Key가 등장하지만 해결하려는 문제는 다르다.
Encryption은 내용을 특정 수신자만 읽게 한다
Alice가 Bob에게 다음 Message를 보내려고 한다고 하자.
계좌번호: 123-456-789
Alice는 이 내용을 네트워크를 지나는 다른 사람이 읽지 못하게 하고 싶다.
이때 Bob이 Public Key와 Private Key를 가지고 있다면 Alice는 Bob의 Public Key를 이용해 데이터를 암호화할 수 있다.
Alice
→ Bob의 Public Key로 암호화
→ Ciphertext 전송
→ Bob이 자신의 Private Key로 복호화
Public Key는 공개되어 있으므로 Alice뿐 아니라 다른 사람도 Bob에게 암호화된 데이터를 보낼 수 있다.
하지만 대응되는 Private Key는 Bob만 가지고 있기 때문에 Ciphertext에서 원래 내용을 복원할 수 있는 주체를 Bob으로 제한할 수 있다.
즉 Encryption에서 중요한 질문은 다음이다.
이 데이터를 누가 읽을 수 있어야 하는가?
비대칭 Encryption에서는 수신자의 Public Key로 데이터를 보호하고, 수신자의 Private Key로 복호화하는 구조를 사용할 수 있다.
따라서 핵심 목적은 Confidentiality, 즉 허가되지 않은 주체가 데이터의 내용을 읽지 못하게 하는 것이다.
실제 시스템에서는 성능과 데이터 크기 등의 이유로 비대칭 암호로 모든 데이터를 직접 암호화하기보다 대칭키와 비대칭키를 함께 사용하는 구조가 흔하다.
Digital Signature는 누가 서명했고 변경되지 않았는지 확인한다
이번에는 상황이 다르다.
Alice가 Bob에게 다음 Message를 보낸다고 하자.
송금 금액 = 10,000원
이번에는 Message 자체를 숨길 필요는 없다.
대신 Bob은 다음 두 가지를 확인하고 싶다.
- 해당 Public Key에 대응되는 Private Key를 가진 주체가 이 Message에 서명했는가
- 전달되는 동안
10,000원이1,000,000원으로 바뀌지는 않았는가
이 문제를 해결하는 것이 Digital Signature다.
Alice는 자신의 Private Key를 이용해 Message에 대한 Signature를 생성한다.
Alice
→ 자신의 Private Key로 Signature 생성
→ Message + Signature 전달
Bob은 Alice의 Public Key를 이용해 Signature를 검증한다.
Bob
→ Message + Signature 수신
→ Alice의 Public Key로 Verification
→ Valid / Invalid
검증에 성공하면 적어도 다음을 확인할 수 있다.
- 현재 Message가 Signature 생성 이후 변경되지 않았다.
- 해당 Public Key에 대응되는 Private Key를 이용해 Signature가 생성되었다.
여기서 중요한 점은 Digital Signature가 Message의 내용을 숨기지는 않는다는 것이다.
Message는 그대로 볼 수 있다.
Signature는 Message를 암호화하는 값이 아니라 현재 Message와 Signature의 관계가 유효한지 검증할 수 있게 하는 별도의 값이다.
즉 Digital Signature에서 중요한 질문은 다음이다.
이 데이터를 어떤 Private Key가 서명했고, 서명 이후 내용이 바뀌지는 않았는가?
Encryption과 Digital Signature 비교
| 구분 | Encryption | Digital Signature |
| 해결하는 문제 | 누가 내용을 읽을 수 있는가 | 누가 서명했고 내용이 변경되지 않았는가 |
| 주요 목적 | Confidentiality | Integrity와 Signature Verification |
| 사용하는 Public Key | Receiver의 Public Key | Signer의 Public Key |
| 사용하는 Private Key | Receiver의 Private Key | Signer의 Private Key |
| 동작 | Public Key로 암호화 → Private Key로 복호화 | Private Key로 서명 → Public Key로 검증 |
| Message를 숨기는가 | O | X |

따라서 두 흐름은 다음처럼 구분해서 기억하면 된다.
Encryption
Receiver의 Public Key → 암호화
Receiver의 Private Key → 복호화
Digital Signature
Signer의 Private Key → Signature 생성
Signer의 Public Key → Signature 검증
다만 이것을 같은 암호화 연산을 반대 방향으로 실행한다고 이해하면 안 된다.
특히 Digital Signature를 다음처럼 설명하는 것은 피하는 편이 좋다.
Private Key로 암호화하고 Public Key로 복호화한다.
Digital Signature에서는 데이터를 암호화하고 다시 복원하는 것이 목적이 아니다.
정확히는 Private Key를 이용해 Message에 대한 Signature를 생성하고, Public Key를 이용해 그 Signature가 현재 Message에 대해 유효한지 검증한다.
4. 디지털 서명은 Message와 Private Key를 연결한다
Digital Signature가 Message의 변조를 어떻게 검출할 수 있는지 살펴보자.
Alice가 다음 Message에 서명한다고 하자.
role=user
Signature는 Message와 무관하게 만들어지는 임의의 값이 아니다.
현재 Message와 Alice의 Private Key를 기반으로 만들어지는 값이다.
Hash는 Message의 내용을 대표하는 값이다
Digital Signature Algorithm에서는 일반적으로 Message를 Hash Function에 입력해 일정한 크기의 Message Digest를 만든다.
Message → Hash Function → Message Digest
예를 들어 SHA-256을 사용한다고 하자.
role=user
이 Message에서 어떤 Hash A가 만들어졌다고 하자.
그런데 Message가 다음처럼 변경되면:
role=admin
Hash 결과도 달라진다.
- role=user → Hash A
- role=admin → Hash B
- Hash A ≠ Hash B
즉 Message의 내용이 달라지면 그 Message에서 계산한 Digest도 달라진다.
Hash는 Encryption과도 다르다.
Hash 값을 다시 역으로 계산해서 원래 Message를 복원하는 것이 목적이 아니다.
Private Key를 이용해 Signature를 생성한다
Alice는 Message를 기반으로 계산한 값을 자신의 Private Key와 Signature Algorithm에 사용한다.
개념적으로 다음과 같이 이해할 수 있다.
Message → Hash → Private Key를 이용한 Signature 연산 → Signature
그 결과 원본 Message와 별도로 Signature 값이 만들어진다.
Alice는 Bob에게 다음 두 가지를 전달할 수 있다.
Message + Signature
여기서 Signature는 Message에 종속되어 있다.
Message가 달라지면 기존 Signature는 변경된 Message에 대해 더 이상 유효하지 않다.

Public Key로 현재 Message와 Signature의 관계를 검증한다
Bob은 Alice가 보낸 Message와 Signature를 받는다.
Message: role=user
Signature: abc123...
그리고 Alice의 Public Key를 가지고 있다고 하자.
Bob은 Signature Verification Algorithm에 다음 정보를 사용한다.
Message + Signature + Alice의 Public Key
검증 결과는 Valid 또는 Invalid가 된다.
정상적인 Message와 Signature라면 Verification에 성공한다.
그런데 공격자가 Message만 다음과 같이 변경했다고 하자.
role=admin
기존 Signature는 원래 role=user Message를 기준으로 만들어진 값이다.
따라서 Message는 변경되었지만 Signature는 그대로인 상태가 된다.
- 원본 Message → Hash A → Signature A
- 변조된 Message → Hash B
- 변조된 Message + Signature A + Public Key → Verification Failed
공격자가 검증을 통과하려면 변경된 Message에 맞는 새로운 정상 Signature도 만들어야 한다.
하지만 정상적인 Signature를 새로 만들려면 Alice가 가진 Private Key가 필요하다.
공격자가 Private Key를 가지고 있지 않다면 변경된 Message에 대해 Alice의 Key Pair와 일치하는 정상적인 Signature를 만들 수 없다.
이것이 Digital Signature가 Message의 변조를 검출할 수 있는 핵심 원리다.
Public Key가 공개되어도 되는 이유
Bob뿐 아니라 다른 사람도 Alice의 Public Key를 가지고 Signature를 검증할 수 있다.
하지만 Public Key를 가지고 있다고 해서 Alice를 대신해 새로운 Signature를 만들 수 있는 것은 아니다.
두 Key의 역할이 다르기 때문이다.
Private Key → Signature 생성
Public Key → Signature 검증
즉 Digital Signature에서는 서명할 수 있는 권한은 Private Key를 가진 주체에게 두면서, Signature 검증은 Public Key를 받은 여러 주체가 수행할 수 있다.
5. Public Key를 가지고 있다고 그 주체를 바로 신뢰할 수 있는 것은 아니다
Digital Signature에서는 Public Key를 이용해 Signature를 검증할 수 있다.
하지만 여기에는 아직 하나의 문제가 남아 있다.
현재 가지고 있는 Public Key가 정말 내가 신뢰하려는 주체의 Public Key라는 것은 어떻게 확인할 수 있을까?
앞에서는 Bob이 Alice의 Public Key를 가지고 있다고 가정했다.
하지만 Bob이 인터넷에서 어떤 Public Key 하나를 전달받았다고 해서 그 Key가 자동으로 Alice의 Public Key가 되는 것은 아니다.
공격자가 자신의 Key Pair를 만들고 자신의 Public Key를 Alice의 Public Key라고 속여 전달할 수도 있기 때문이다.
이 경우 공격자는 자신의 Private Key로 Signature를 생성할 수 있고, Bob은 공격자가 전달한 Public Key로 해당 Signature를 정상적으로 검증할 수도 있다.
Cryptographic Verification 자체는 성공하지만 처음부터 잘못된 Public Key를 신뢰하고 있었던 것이다.
따라서 다음 두 문제를 구분해야 한다.
| 문제 | 확인하는 것 |
| Signature Verification | 현재 Message와 Signature가 이 Public Key에 대해 유효한가 |
| Public Key Trust | 이 Public Key가 정말 내가 신뢰하려는 주체의 Key인가 |
Cryptography의 Signature Verification은 첫 번째 문제를 해결해준다.
하지만 어떤 Public Key를 누구의 Key라고 신뢰할 것인지는 별도의 신뢰 구조가 필요하다.
Public Key를 신뢰할 수 있게 전달하는 방법
실제 시스템에서는 Public Key의 소유자를 확인하고 Key를 안전하게 배포하기 위해 목적에 따라 서로 다른 방법을 사용한다.
| 구조 | Public Key를 신뢰하는 방법 |
| HTTPS / TLS | Certificate와 CA Trust Chain 등을 이용해 Server와 Public Key의 관계를 검증 |
| SSH | Host Key를 확인하고 저장하거나 별도의 신뢰 절차를 사용 |
| JWT / JWKS | 신뢰하도록 설정한 Issuer가 제공하는 JWKS에서 검증용 Public Key를 가져옴 |
즉 Public Key Cryptography에서 중요한 것은 Public Key를 공개하는 것만이 아니다.
어떤 Public Key를 누구의 Key라고 신뢰할 것인지 결정하는 과정도 함께 필요하다.
이 구분을 이해하면 이후 JWT와 JWKS에서 왜 아무 Public Key나 사용해서 Token을 검증하면 안 되는지도 이해할 수 있다.
다음 글에서는 이 원리를 실제 Token에 적용해 Private Key로 JWT에 Signature를 생성하고, Public Key를 이용해 Signature를 검증하는 구조를 살펴본다.
정리
Public Key와 Private Key는 비대칭 Cryptography에서 함께 사용하는 Key Pair다.
- Private Key — 소유자가 비밀로 유지한다.
- Public Key — 다른 주체에게 공개할 수 있다.
하지만 Key Pair를 사용하는 목적에 따라 동작은 달라진다.
Encryption은 데이터의 내용을 보호한다.
Receiver의 Public Key → 암호화 → Receiver의 Private Key → 복호화
Digital Signature는 Message가 서명 이후 변경되지 않았는지와 해당 Public Key에 대응되는 Private Key를 이용해 Signature가 생성되었는지를 검증한다.
Signer의 Private Key → Signature 생성 → Signer의 Public Key → Signature 검증
Digital Signature에서는 Message가 변경되면 기존 Signature가 더 이상 유효하지 않기 때문에 변조를 검출할 수 있다.
또 Public Key를 가지고 있는 것만으로는 충분하지 않다.
- Signature가 특정 Public Key에 대해 유효한지 확인하는 것과
- 그 Public Key가 실제로 어떤 주체의 Key인지 신뢰하는 것은 서로 다른 문제다.
다음 글에서는 이 개념을 JWT와 JWKS에 적용해 Token을 어떻게 서명하고, Public Key를 어떻게 배포하며, Resource Server가 어떤 방식으로 Signature를 검증하는지 살펴본다.
'보안' 카테고리의 다른 글
| JWT와 JWKS — Token을 서명하고 검증하는 방법 (0) | 2026.09.27 |
|---|---|
| Token 기반 인증 이해하기 — Bearer, Access·Refresh Token (0) | 2026.09.26 |
| Session의 동작 원리 — Session ID와 서버 측 상태 관리 (1) | 2026.09.26 |
| Cookie의 동작 원리 — Scope와 보안 속성 (0) | 2026.09.25 |
| 웹 인증의 기본 — Cookie / Session / Token (0) | 2026.09.25 |