본문 바로가기
일반IT/IT보안

🔐 내 비밀번호는 안전할까? OWASP 2위, 암호화 실패 파헤치기

by gasbugs 2025. 9. 29.

안녕하세요! 👋 지난번 A01: 깨진 접근 통제에 이어, 오늘은 OWASP Top 10 2021의 2위로 급부상한 A02: 암호화 실패(Cryptographic Failures)에 대해 이야기해보려고 합니다.

 

예전에는 '민감 정보 노출(Sensitive Data Exposure)'로 불렸던 이 항목은, 단순히 데이터를 암호화하지 않는 것뿐만 아니라 '잘못된' 암호화의 위험성을 강조하며 2위까지 올라왔습니다. 내 소중한 정보가 인터넷 세상에 그대로 노출될 수도 있는 무서운 취약점, 지금부터 함께 알아보시죠! 😱

 

 

🤔 암호화 실패? 그게 정확히 뭔가요?

"비밀일기는 꼭 자물쇠 달린 상자에 보관해야 해!" 📦

어릴 때 이런 생각 한 번쯤 해보셨죠? 암호화(Cryptography)는 바로 이 '자물쇠' 역할을 합니다. 중요한 데이터를 아무나 알아볼 수 없는 비밀 코드(암호문)로 바꿔서 보호하는 기술이죠.

 

암호화 실패는 이 자물쇠가 부실하거나, 열쇠를 아무 데나 두거나, 심지어 자물쇠를 아예 사용하지 않는 모든 경우를 말합니다. 데이터는 크게 두 가지 상태로 존재하는데, 이 두 상태 모두에서 자물쇠는 필수입니다.

  1. 전송 중인 데이터 (Data in Transit) ✈️:
    • 여러분의 컴퓨터에서 서버로 데이터가 날아가는 중 (로그인, 회원가입, 게시글 작성 등)
    • 이때 암호화가 없으면 중간에서 누군가 데이터를 가로채서 엿볼 수 있습니다. (중간자 공격)
  2. 저장된 데이터 (Data at Rest) 💾:
    • 서버의 데이터베이스나 파일 시스템에 데이터가 저장되어 있는 상태
    • 만약 해커가 서버를 통째로 해킹하면, 암호화되지 않은 데이터는 그대로 털리게 됩니다.

🚨 암호화 실패의 흔한 사례들

어떤 경우에 암호화가 '실패'했다고 말할 수 있을까요? 개발자가 흔히 저지르는 실수들을 통해 살펴보겠습니다.

1. 평문 통신 (HTTP 사용)

가장 기본적이지만 여전히 많이 발견되는 실수입니다.

  • 문제점: HTTP는 데이터를 암호화하지 않은 평문(Plain Text)으로 전송합니다. 마치 투명한 봉투에 편지를 넣어 보내는 것과 같아서, 네트워크를 감시하는 누구나 내용을 엿볼 수 있습니다. 👂
  • 해결책: 반드시 HTTPS를 사용해야 합니다. HTTPS는 TLS/SSL이라는 프로토콜을 이용해 모든 통신 내용을 암호화하여 안전하게 보호합니다. 주소창에 자물쇠 🔒 아이콘이 있는지 항상 확인하세요!

2. 비밀번호를 평문으로 저장

절대로 해서는 안 되는 최악의 실수입니다!

  • 문제점: 데이터베이스에 password123과 같이 비밀번호를 그대로 저장하는 경우, DB가 유출되면 모든 사용자의 계정이 즉시 탈취됩니다.
  • 해결책: 비밀번호는 반드시 해시(Hash)하여 저장해야 합니다. 해시는 암호화와 달리 원래 값으로 되돌릴 수 없는 단방향 함수입니다.
  • 업그레이드: 더 안전하게는 솔트(Salt)를 추가한 해싱을 사용해야 합니다. 솔트(🧂)는 비밀번호에 추가하는 임의의 문자열로, 같은 비밀번호를 사용하더라도 DB에 저장되는 해시 값이 달라지게 만들어 레인보우 테이블 같은 공격을 무력화합니다.
    • password123 + Salt(랜덤값) -> Hash_Value(완전히 다른 값)

3. 약하거나 오래된 암호 알고리즘 사용

모든 자물쇠가 튼튼하지는 않아요! 낡고 약한 자물쇠는 금방 부서집니다.

  • 문제점: MD5, SHA-1 같은 오래된 해시 알고리즘이나 DES, RC4 같은 암호화 알고리즘은 이미 취약점이 발견되어 쉽게 깨질 수 있습니다. ☠️
  • 해결책: 검증된 최신 표준 알고리즘을 사용해야 합니다.
    • 해싱: SHA-256 이상, Bcrypt, Scrypt, Argon2
    • 암호화: AES (Advanced Encryption Standard)

4. 부실한 암호 키 관리

금고는 튼튼한데, 열쇠를 금고 위에 올려두는 것과 같습니다.

  • 문제점: 암호화에 사용된 키(Key)를 소스 코드에 그대로 적어두거나(하드코딩), 설정 파일에 평문으로 저장하는 경우입니다. 소스 코드가 유출되면 암호화는 무용지물이 됩니다. 🔑
  • 해결책: 암호 키는 별도의 안전한 저장소(Key Vault, KMS 등)에 보관하고, 접근 권한을 엄격하게 관리해야 합니다. 또한, 주기적으로 키를 교체(Key Rotation)하는 것이 안전합니다.

🛡️ 어떻게 막을 수 있을까요? (방어 방법)

  1. 데이터 분류 및 식별 📂: 먼저 우리 서비스에서 어떤 데이터가 민감한지(개인정보, 금융정보 등) 식별하고, 보호가 필요한 데이터의 우선순위를 정합니다.
  2. 전송 구간 암호화는 기본! 🌐: 모든 통신은 HTTPS를 사용하고, 최신 버전의 TLS 설정을 적용하여 중간자 공격을 방어합니다.
  3. 저장 데이터 암호화 💾: 데이터베이스에 저장되는 모든 민감 정보는 강력한 암호화 알고리즘(AES 등)을 사용해 암호화합니다.
  4. 강력한 비밀번호 해싱 🧂: 비밀번호는 반드시 Bcrypt, Scrypt, Argon2와 같은 최신 알고리즘을 사용해 솔트를 추가하여 해시화합니다.
  5. 안전한 키 관리 🗝️: 암호화 키를 코드나 설정 파일에 두지 말고, 전용 키 관리 시스템을 사용하세요.
  6. 바퀴를 재발명하지 마세요 🤓: 절대 직접 암호화 알고리즘을 만들려고 하지 마세요. 수많은 전문가에 의해 검증되고 널리 사용되는 표준 라이브러리를 사용하는 것이 가장 안전하고 현명한 방법입니다.

✨ 마치며

암호화는 보안의 기본 중의 기본이지만, '어떻게' 적용하느냐에 따라 그 효과는 천차만별입니다. "일단 암호화했으니 괜찮아"라는 생각은 매우 위험합니다.

 

오늘부터 내가 다루는 데이터가 안전한 자물쇠로 잘 잠겨 있는지, 그리고 그 열쇠는 나만 아는 곳에 잘 보관되어 있는지 다시 한번 점검해보는 것은 어떨까요? 데이터 보안의 첫걸음은 올바른 암호화에서 시작됩니다!