HTTP의 통신등에서 데이터들은 평문 그대로 통신하기에, 중간에 누가 가로채거나 했을때에 정보가 누출될 우려가 있다.
이런 보안적인 취약점을 보완하기 위해, HTTPS에서는 주고받는 데이터를 암호화한다.
이때 대칭키/비대칭키 기반으로 암호화를 한다.
대칭키는 암호화 할때나 복호화 할때나 같은 키값을 사용하는것이고,
비대칭키는 암호화 할때의 키값과 복호화 할 때의 키값이 서로 다른 2개를 사용 하는 방식이다.
*참조: 여기서 말하는 '키(key)'는 암호화/복호화에 쓰이는 값으로 암복호화를 하는 기준값 이라고 볼 수 있다. 해쉬 값이라고 봐도 무방하다.
대칭키 vs 비대칭키
1.통신비용
대칭키가 비대칭키에 비해 통신비용이 크다.
대칭키는 암호화, 복호화에 같은 키가 쓰인다. 그렇다면 이 키 값을 모두에게 알려준다면? 암호화한 값을 다시 평문으로 돌릴 수 있게 한것이기 때문에 암호화를 하는 이유가 없어진다.
그렇기에 대칭키의 경우, 이 키 값을 사용자에게 안전하게 보낼 수 있는 안전한 통신채널을 따로 확보해야 하고 이는 비용의 증가로 이어진다.
하지만 비대칭키는 이럴 필요가 없다.
비대칭키는 암호화할 때의 키 값과 복호화 할 때의 키 값이 다르다. 그렇기에 암호화 할때 쓰는 키는 공개키 라고 하여서 모두에게 공개 or 배포하고, 복호화 할 때 쓰는 키는 개인키라고 하여서 서버나 운영진쪽에서 비밀리에 가지고 있는다.
2. 보안성
비대칭키가 대칭키에 비해 보안성이 우수하다.
키값을 모두에게 배포하는 대칭키 방식은 신뢰성 있는 채널을 사용하더라고 누출 될 우려가 있지만,
비대칭키의 경우 개인키의 경우 배포하지 않기 때문에 누출될 우려가 훨씬 낫다.
3.속도
대칭키가 비대칭키에 비해 훨씬 빠르다.
비대칭키는 한쌍의 키를 가지고 있어야 하기때문에 암복호화 하는 수학공식이 대칭키에 비해 복잡하기 때문이다.
그렇다면 어느정도로 속도가 차이나는가?
대표적인 대칭키 암호화 AES, 비대칭키 암호화 RSA의 경우
AES는 1초에 수백 mg에서 수 gb까지 암호화 한다. 1초에 500mg의 데이터를 암호화 한다고 가정하고,
RSA는 하나의 암호화 또는 복호화 작업이 1ms에서 수십ms 까지 걸릴 수 있다. 한번의 암호화에 1ms가 걸린다고 가정한다
예시로 1kb크기의 데이터 100만건의 총 1gb데이터를 암호화 하는 시간을 대략적으로 계산해서 비교해본다.
대칭키 암호화 AES는 1초에 500mg의 암호화니 대략 2초가 걸릴 것이다.
비대칭키 암호화 RSA는 데이터 1건에 1ms정도가 걸린다고 가정했으니 100만*1ms = 1000초 ≈ 16.7분 즉, 1002초 정도가 걸릴 것이다.
속도차이는 약 501배 정도가 나는 것이다.
이는 암호화 속도만 비교한 것이고 하나의 데이터의 크기가 커질 수록 시간이 늘어나고, 암호화보다 복호화가 더 시간이 오래 걸린다.
물론 CPU나 각각의 환경에 따라 달라질 수 있다. 이는 필자가 직접 테스트 해본 것이 아니라, 대략적인 속도범위에서 성능을 가정하고, 이를 기반으로 chatGPT의 도움을 받아 계산을 해본 것에 불과하다.
실제로는 대칭키 방식의 속도와, 비대칭키 방식의 보안성을 모두 활용하기 위해 함께 사용하는 경우가 많다.
다음은 그 예시중의 하나이다.
세션 키 방식
- 데이터 암호화에는 빠른 대칭키 암호화 방식을 사용하고, 이 대칭키(세션 키)는 비대칭키 암호화를 사용하여 안전하게 전달합니다.
- 예를 들어, HTTPS 프로토콜에서는 세션 키를 설정하기 위해 비대칭키 암호화를 사용하고, 이후 데이터 전송에는 대칭키 암호화를 사용합니다.
이렇게 혼용함으로써 속도와 보안의 균형을 맞추는 것이 일반적이다. 속도 차이는 매우 크기 때문에, 실질적인 사용에서 대칭키 암호화가 훨씬 더 효율적이다.
서로 장단점이 상반되는 기술이 있을 때, 어느 것을 선택하지 않고 이렇게 혼용하여 기술들의 단점은 커버하고, 장점만을 부각시키는 방식은 컴퓨터과학에서 종종 사용하는 문제해결 방식인 듯 하다.
'개발공부' 카테고리의 다른 글
SaaS (Software as a Service) ? (3) | 2024.11.28 |
---|---|
MSA (Microservices Architecture) (1) | 2024.04.14 |
깃허브 fetch vs pull (0) | 2024.03.25 |
깃 (Git) (0) | 2024.03.23 |
Client, Browser, Server, HTTP (0) | 2023.08.28 |