카페에서 와이파이에 연결할 때, 인터넷 뱅킹을 할 때, 혹은 그냥 SNS에 로그인할 때 — 우리는 매일 수십 번씩 개인 정보를 인터넷에 흘려보내고 있어요. 그런데 그게 중간에 누군가에게 가로채이지는 않는 걸까요? 과연 어떻게 안전하게 전달되는 걸까요?

오늘은 그 비밀의 핵심, 암호화(Encryption) 에 대해 이야기해보려고 해요.


암호화란 뭔가요?

암호화란 쉽게 말해 데이터를 알아볼 수 없는 형태로 변환하는 것이에요. 원래 데이터(평문)를 특정 규칙(알고리즘)과 열쇠(키)를 사용해서 뒤죽박죽으로 섞어놓는 거죠.

암호화된 데이터는 올바른 키가 없으면 해석이 불가능해요. 누군가 중간에서 데이터를 가로챘다고 해도, 키가 없으면 그냥 의미 없는 문자 덩어리일 뿐이에요.


대칭키 vs 비대칭키 — 자물쇠가 두 종류인 이유

암호화 방식은 크게 두 가지로 나뉘어요.

대칭키 암호화

암호화할 때와 복호화할 때 같은 키를 사용하는 방식이에요. 마치 하나의 열쇠로 잠그고 여는 자물쇠처럼요.

속도가 빠르고 구현이 간단하다는 장점이 있어요. 대표적인 알고리즘으로는 AES(Advanced Encryption Standard) 가 있는데, 현재 전 세계적으로 가장 많이 쓰이는 대칭키 알고리즘이에요.

단점은 키를 상대방에게 전달하는 과정 자체가 위험하다는 거예요. 키를 넘겨주는 도중에 누군가 가로채버리면 그걸로 끝이거든요.

비대칭키 암호화

이 문제를 해결하기 위해 등장한 게 비대칭키 암호화예요. 암호화할 때 쓰는 키(공개키)와 복호화할 때 쓰는 키(개인키)가 서로 달라요.

공개키는 말 그대로 누구에게나 공개해도 괜찮아요. 누군가 내 공개키로 메시지를 암호화해서 보내면, 나만 가진 개인키로만 풀 수 있는 구조예요.

대표적인 알고리즘은 RSA예요. 다만 대칭키보다 연산이 훨씬 무겁기 때문에, 실제로는 비대칭키로 먼저 안전하게 대칭키를 교환한 다음, 이후 통신은 대칭키로 처리하는 방식을 많이 써요.


HTTPS — 자물쇠 아이콘의 정체

브라우저 주소창 왼쪽에 자물쇠 아이콘 보이시죠? 그게 바로 HTTPS 가 적용되어 있다는 표시예요.

HTTPS는 HTTP에 TLS(Transport Layer Security) 라는 암호화 레이어를 얹은 거예요. 과정을 간단히 요약하면 이렇게 돼요:

  1. 브라우저가 서버에 접속 요청을 보내요.
  2. 서버가 자신의 인증서(공개키 포함) 를 브라우저에 보내요.
  3. 브라우저는 인증서가 신뢰할 수 있는 기관(CA)에서 발급된 건지 확인해요.
  4. 확인이 되면, 브라우저가 대칭키를 만들어 서버의 공개키로 암호화해서 전달해요.
  5. 이제 둘 다 같은 대칭키를 갖게 됐으니, 이걸로 이후 통신을 암호화해요.

이 과정을 TLS 핸드셰이크라고 불러요. 눈 깜짝할 사이에 일어나지만, 이 짧은 순간에 꽤 복잡한 일이 벌어지는 거예요. 신기하죠?


비밀번호는 어떻게 저장되는 걸까요?

여기서 많은 분들이 오해하시는 게 하나 있어요. 여러분의 비밀번호가 서버에 그대로 저장되어 있을 거라고 생각하시는 분들이 꽤 있는데요, 제대로 된 서비스라면 절대 그렇게 하지 않아요.

비밀번호는 해시(Hash) 라는 방식으로 변환되어 저장돼요.

해시 함수는 입력값을 받아서 고정된 길이의 문자열로 바꿔주는 함수예요. 중요한 특징이 두 가지 있어요:

  • 단방향이에요. 해시값으로 원래 비밀번호를 역산할 수 없어요.
  • 같은 입력은 항상 같은 해시값이 나와요. 그래서 로그인할 때 비밀번호를 입력하면, 그걸 해시해서 저장된 해시값과 비교하는 거예요.

대표적인 해시 알고리즘으로는 SHA-256, bcrypt 등이 있어요. 특히 bcrypt는 비밀번호 저장에 특화되어 있어서, 의도적으로 연산을 느리게 만들어 무차별 대입 공격(Brute Force)을 어렵게 해요.

그리고 요즘은 여기에 솔트(Salt) 라는 것도 추가해요. 비밀번호 해시 전에 랜덤한 값을 붙여서 같은 비밀번호도 다른 해시값이 나오도록 만드는 거예요. 이렇게 하면 미리 만들어둔 해시 테이블(레인보우 테이블)로 공격하는 것도 막을 수 있어요.


공개키 기반 구조 — 인증서는 왜 필요한가요?

비대칭키 암호화에서 한 가지 허점이 있어요. 서버가 보내온 공개키가 정말 그 서버의 것인지 어떻게 믿을 수 있냐는 거예요.

이를 해결하기 위해 인증 기관(CA, Certificate Authority) 이 등장해요. CA는 제3의 신뢰할 수 있는 기관으로, 서버의 신원을 확인하고 디지털 인증서를 발급해줘요.

브라우저에는 신뢰할 수 있는 CA 목록이 미리 내장되어 있어요. 서버가 인증서를 제시하면, 브라우저는 그 인증서가 신뢰하는 CA에 의해 서명된 것인지 확인하는 거예요. 이 과정 덕분에 가짜 서버로 연결되는 중간자 공격(MITM)을 방어할 수 있어요.


마무리하며

암호화는 인터넷이 지금처럼 안전하게 작동할 수 있는 근간이에요. 우리가 로그인하고, 결제하고, 메시지를 보낼 수 있는 모든 순간 뒤에는 이런 수학적 원리들이 조용히 작동하고 있어요.

다음에는 실제 해킹 기법(SQL Injection, XSS 등)이나 공개키 암호화의 수학적 원리에 대해서도 이야기해볼게요. 궁금한 부분이 있으시면 댓글로 남겨주세요!