2.8 중요정보 전송

개요

네트워크를 통해 중요 정보(개인정보, 인증정보, 금융정보, 영업비밀 등)를 평문으로 전송하는 것은 스니핑(Sniffing) 공격 등에 의해 데이터가 쉽게 가로채여 노출될 수 있는 매우 심각한 보안 문제입니다. 특히 인터넷과 같이 신뢰할 수 없는 네트워크 구간에서는 데이터 전송 시 기밀성과 무결성을 보장하는 것이 필수적입니다.

이를 위해 TLS(Transport Layer Security) / SSL(Secure Sockets Layer)과 같은 표준 보안 프로토콜을 사용하여 통신 채널 자체를 암호화하는 것이 가장 일반적이고 권장되는 방법입니다. HTTPS(HTTP over TLS/SSL)가 대표적인 예입니다.

이 기준은 네트워크를 통해 중요 정보를 전송할 때, 데이터의 기밀성과 무결성을 보장하기 위해 안전한 암호화 통신 프로토콜을 적용하는 것에 대한 보안 요구사항을 정의합니다.

보안 대책

  • - TLS/SSL 적용 필수: 중요 정보(로그인 정보, 개인정보, 결제 정보 등)를 전송하는 모든 통신 구간에는 반드시 TLS 1.2 이상 버전의 보안 프로토콜을 적용합니다. (SSL 3.0 및 이전 TLS 버전은 취약점이 발견되어 사용 금지)
  • - 안전한 암호화 스위트(Cipher Suite) 사용: TLS/SSL 설정 시, 현재 안전하다고 검증된 암호화 알고리즘, 키 교환 방식, 해시 함수로 구성된 암호화 스위트만을 사용하도록 서버를 설정합니다. (예: RC4, DES, 3DES, MD5, SHA-1 기반 스위트 비활성화)
  • - 신뢰할 수 있는 인증서 사용: 서버 인증을 위해 공인된 인증기관(CA: Certificate Authority)에서 발급한 유효한 인증서를 사용하고, 인증서 체인 검증이 올바르게 이루어지도록 설정합니다.
  • - HSTS(HTTP Strict Transport Security) 적용 고려: 웹 서버에서 HSTS 헤더를 전송하여, 웹 브라우저가 해당 도메인에 항상 HTTPS로만 접속하도록 강제함으로써 SSL 스트리핑(SSL Stripping) 공격을 방어할 수 있습니다.
  • - 애플리케이션 레벨 암호화 고려: TLS/SSL 적용이 어려운 환경이거나 종단 간(End-to-End) 암호화가 필요한 경우, 전송 전에 애플리케이션 레벨에서 중요 데이터를 직접 암호화하는 방식을 고려할 수 있습니다. (키 관리가 중요)
  • - 민감 정보 로깅 주의: 중요 정보가 전송 과정이나 처리 과정에서 평문으로 로그 파일에 기록되지 않도록 주의합니다.

코드 예시 (개념 설명)

중요 정보의 안전한 전송은 특정 프로그래밍 코드보다는 서버 환경 설정(예: 웹 서버의 HTTPS 설정) 및 클라이언트-서버 통신 방식에 크게 의존합니다.

취약한 방식 (HTTP 사용):

<!-- 로그인 폼 전송 시 HTTP 사용 -->
<form action="http://example.com/login" method="post"> 
    <input type="text" name="username">
    <input type="password" name="password"> <!-- 비밀번호가 평문 전송됨 -->
    <button type="submit">로그인</button>
</form>
                        

// JavaScript (AJAX) 요청 시 HTTP 사용
fetch('http://api.example.com/sensitive-data', { // HTTP 사용
    method: 'POST',
    headers: { 'Authorization': 'Bearer user_token' }, // 토큰이 평문 전송됨
    body: JSON.stringify({ data: 'important_info' })
})
.then(response => response.json())
.then(data => console.log(data));
                        
안전한 방식 (HTTPS 사용):

<!-- 로그인 폼 전송 시 HTTPS 사용 -->
<form action="https://example.com/login" method="post"> 
    <input type="text" name="username">
    <input type="password" name="password"> <!-- 비밀번호가 암호화되어 전송됨 -->
    <button type="submit">로그인</button>
</form>
                        

// JavaScript (AJAX) 요청 시 HTTPS 사용
fetch('https://api.example.com/sensitive-data', { // HTTPS 사용
    method: 'POST',
    headers: { 'Authorization': 'Bearer user_token' }, // 토큰이 암호화되어 전송됨
    body: JSON.stringify({ data: 'important_info' })
})
.then(response => response.json())
.then(data => console.log(data));
                        

웹 서버(Apache, Nginx, IIS 등)에서 TLS/SSL 인증서를 설정하고 HTTPS를 활성화하는 것이 가장 기본적인 조치입니다. Java(HttpsURLConnection, Apache HttpClient), Python(requests, urllib), C#(HttpClient), Node.js(https 모듈) 등 대부분의 HTTP 클라이언트 라이브러리는 HTTPS 통신을 지원하며, 인증서 유효성 검증 옵션을 올바르게 사용하는 것이 중요합니다.