본문 바로가기

기타

SSL/TLS 통신은 어떻게 만들어졌는지? 대칭키/비대칭키/해시/인증서

이 글에서는 복잡한 보안 방식을 걷어내고, 백엔드 개발자가 네트워크 통신에서 사용하는 암호화에 대해 필수적으로 알아야 하는 기본 내용을 간단히 설명하겠습니다.

 

보안의 기본 컴포넌트

해시 함수란?

해시는 HashCode, Set, Map 등에서 널리 사용되는 개념으로, 보안에서도 핵심적인 역할을 합니다.

해시 함수는 계산 식을 나타내며, 해시 알고리즘 f(x) = y 에 대해서 다음 조건을 충족해야 합니다.

  • 같은 입력값은 같은 출력값을 가짐 (확정성)
  • 결과값만으로 입력값을 역추적할 수 없음 (단방향성)
  • 다른 입력값은 다른 출력값을 가짐 (충돌 저항성)

예를 들어 체크섬(Checksum)을 알아봅시다. 문자열 "abc" 를 ASCII 로 변환하면 97, 98, 99 가 됩니다.

3개의 값을 10으로 나머지 연산과 덧셈을 해보겠습니다.

  • (97 + 98 + 99) % 10 = 4

결과값은 4 입니다.

 

데이터가 이상이 생겨서 값이 "abd" 로 변경되었다면, ASCII는 97, 98, 100 이므로 결과값은 5가 됩니다.

이렇게 4와 5를 통해 원래 값을 도출할수는 없지만, 다른 입력값이 있다는 것을 알 수 있습니다.

 

해시 알고리즘의 확정성과, 단방향성을 만족하였습니다.

이제 더 복잡한 연산을 추가하여 중복 가능성을 현저히 낮춘 것을 해시 함수라고 합니다.

대표적으로 SHA-1, SHA-256, MD5 들이 있습니다.

 

Spring Security의 PasswordEncoder도 같은 원리를 사용하며, 보안 강화를 위해 SALT나 PEPPER를 추가합니다.

(실제로 다른 패스워드여도 해시값이 같으면 패스워드 검증에 통과하며, 이를 개선하기 위해 알고리즘을 재귀 실행하며 dummy data(SALT)를 추가하여 해시값을 저장하는 추가 보안 절차가 PasswordEncoder에 있습니다.)

 

대칭키와 비대칭키

대칭키

현관문 키로 비유하면, 대칭키는 문을 열고 닫을 때 같은 키를 사용하는 방식입니다.

XOR 연산을 주로 사용하여 속도가 빠르고 리소스가 적게 듭니다.

비대칭키

비대칭키는 열 때와 닫을 때 서로 다른 키를 사용하는 방식입니다. 하나의 키는 닫힌문만 열수 있으며, 하나의 키는 열린 문만 닫을 수 있습니다.

 

이런 방식을 사용하는 이유는 하나의 키로 암호화를 한것은 다른 키가 없으면 복호화가 불가능 하다는 장점이 있기 때문입니다.

그런 이유로 보통 암호화 하는 키를 public key, 복호화 하는 키를 private key 라고 합니다. (물론 반대로도 가능합니다.)

 

RSA 알고리즘이 대표적이며, 속도가 대칭키에 비해 다소 느립니다.

 

네트워크 통신에서의 암호화

대칭키 암호화 방식의 한계

클라이언트와 서버가 동일한 키를 사용하는 대칭키 방식은 키를 안전하게 전달하기 어려운 문제가 있습니다.

키를 네트워크 상에서 전달하면 키가 노출될 위험이 있고, 외부 저장장치를 통해 직접 전달하기엔 비효율적입니다.

비대칭키 암호화 방식의 한계

비대칭키 방식을 사용하면, 총 2쌍의 키가 존재해야 안전한 암호화 방식이 가능합니다.

  • 서버의 공개키 : 클라이언트가 암호화에 사용할 수 있도록 제공합니다.
  • 서버의 비밀키 : 클라이언트가 준 데이터를 복호화 합니다.
  • 클라이언트의 공개키 : 서버가 암호화에 사용할 수 있도록 제공합니다.
  • 클라이언트의 비밀키 : 서버가 준 데이터를 복호화 합니다.

하나의 공개/비밀 키 쌍은 단방향의 암호화만 가능하므로 2개의 쌍을 사용하여 양방향 암호화를 만들었습니다.

그러나 이러한 암호화 방식은 연산량이 많아 효율성이 떨어집니다.

 

하이브리드 암호화 방식

한쌍의 비대칭키단방향의 암호화가 가능하다고 했습니다.

그럼 그 단방향에 대칭키를 넣어서 전송하면 어떨까? 로 시작됩니다.

  1. 서버가 클라이언트에게 공개키를 제공합니다.
  2. 클라이언트가 대칭키를 생성하여 공개키로 암호화 후 서버에게 보냅니다.
  3. 서버는 비밀키로 대칭키를 복호화 합니다.
  4. 안전하게 클라이언트와 서버가 대칭키를 공유할 수 있게 되었습니다.

이 방식은 성능과 보안을 모두 만족합니다.

 

중간자 공격

대칭키와 비대칭키를 결합한 하이브리드 방식을 사용하면 효율적이고 안전한 암호화가 가능합니다. 그러나 만약 클라이언트와 서버 사이에 중간자가 끼어들어 양쪽 모두의 역할을 수행하는 공격을 하면 어떻게 될까요?

  • 서버는 중간자를 클라이언트로 착각하여 대칭키를 생성합니다.
  • 클라이언트는 중간자를 서버로 착각하여 대칭키를 생성합니다.
  • 공격자는 두 개의 대칭키를 갖고 통신을 중간에서 가로채 읽거나 조작할 수 있게 됩니다.

이러한 상황을 막으려면 클라이언트가 대칭키를 생성할 때, 중간자 없이 신뢰할 수 있는 상태에서만 키가 생성되어야 합니다. 이를 해결하기 위해 인증서를 사용한 신뢰성 검증 방법이 필요합니다.

 

인증서를 통한 신뢰성 검증

인증서는 CA(Certificate Authority, 인증 기관)가 발급하며, RA(Registration Authority, 등록 기관)를 통해 회사의 정보와 안정성, 선택적으로 임원 정보까지도 검증 후 등록합니다. 회사는 발급받은 인증서와 private key를 서버에 보관하여 사용합니다.

 

인증서에는 다음과 같은 정보들이 포함되어 있습니다

  • 도메인 정보
  • 발급자 정보
  • 기관 정보
  • 공개키(public key)
  • 디지털 서명(Signature)

클라이언트가 특정 도메인에 접속할 때, 서버는 인증서를 클라이언트에게 전달합니다.

클라이언트는 이 인증서의 디지털 서명을 CA의 공개키로 검증하여 인증서의 위변조 여부와 발급자의 신뢰성을 확인합니다.

검증이 성공해야만 클라이언트는 안전하게 해당 서버와 통신을 시작할 수 있습니다.

이러한 인증 방식이 현대의 https 통신에 사용되며, 디지털 서명 방식 또한 암호화폐 등에 사용되고 있습니다.

 

마무리하며

네트워크 통신 보안에서 핵심은 키를 안전하게 전달하는 것입니다. 현재는 대칭키와 비대칭키를 결합한 하이브리드 방식과 인증서를 활용해, 보안과 성능을 모두 만족시키는 구조를 사용하고 있습니다.