평문 전송(민감 정보 노출)

Cleartext Transmission of Sensitive Information

설명

이 취약점은 웹 서버가 HTTP처럼 암호화되지 않은 프로토콜로 통신할 때 발생합니다. 클라이언트와 서버 사이의 요청·응답이 TLS(HTTPS)로 보호되지 않으면, 네트워크 상에서 데이터가 그대로(평문) 노출됩니다. 공격자는 같은 네트워크에 있거나 중간에 위치하여 패킷을 가로채는 방식(패킷 스니핑, 중간자 공격 등)으로 로그인 정보, 세션 쿠키, 개인정보 등 민감한 데이터를 쉽게 탈취할 수 있습니다.

잠재적 영향

  • 민감 정보 유출: 암호화되지 않은 채 전송되는 계정 정보, 세션 토큰, 개인정보 등이 네트워크 상에서 그대로 노출되어 공격자가 탈취할 수 있습니다.

  • 계정 탈취 및 세션 하이재킹: 공격자가 탈취한 아이디/비밀번호 또는 세션 쿠키를 사용해 사용자인 척 로그인하거나 세션을 가로챌 수 있습니다.

  • 데이터 변조: 공격자가 중간에 트래픽을 가로채 요청·응답 내용을 조작(예: 결제 금액 변경, 응답 내용 위조)할 수 있습니다.

  • 신뢰도 및 규제 위반: HTTPS 미사용으로 인해 서비스 신뢰도가 떨어지고, 개인정보보호 관련 법규나 보안 표준(예: PCI-DSS)을 위반할 수 있습니다.

해결 방법

  • HTTPS 사용 강제: http.ListenAndServe 대신 반드시 http.ListenAndServeTLS를 사용해 TLS(HTTPS)를 적용합니다.

  • 올바른 인증서 사용: 신뢰할 수 있는 CA에서 발급된 인증서를 사용하거나, 개발·내부 환경에서는 적절히 관리되는 self-signed 인증서를 사용합니다.

  • HSTS 적용: Strict-Transport-Security 헤더를 설정해 브라우저가 항상 HTTPS를 사용하도록 강제합니다.

  • HTTP → HTTPS 리다이렉트: 기존 HTTP 포트(예: 80)는 최소한의 용도로만 사용하고 모든 요청을 HTTPS(예: 443)로 301/302 리다이렉트합니다.

  • 민감 데이터 전송 최소화: 꼭 필요한 경우에만 민감 정보를 전송하고, 토큰·쿠키에는 Secure 플래그를 설정해 HTTPS 연결에서만 전송되도록 합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: http.ListenAndServe는 TLS 없이 일반 HTTP로 서버를 띄웁니다. 이 경우 /login 요청에 포함된 사용자 아이디, 비밀번호가 네트워크 상에서 암호화되지 않은 평문으로 전송됩니다. 같은 네트워크에 있는 공격자는 패킷 스니핑 도구를 사용해 쉽게 해당 값을 가로채 계정 탈취를 할 수 있습니다.

  • 안전한 코드: 수정된 코드는 http.ListenAndServeTLS를 사용해 HTTPS(443 포트)로 서비스를 제공하고, 80 포트는 모든 요청을 HTTPS URL로 리다이렉트만 수행합니다. TLS를 통해 클라이언트와 서버 사이 트래픽이 암호화되므로, 네트워크를 통과하는 동안 공격자가 패킷을 가로채더라도 로그인 정보와 같은 민감 데이터 내용을 직접 확인하거나 조작하기 어렵습니다.

참조

Last updated