7.7. 기밀을 다루는 정보를 숨겨라

기밀을 다루는 정보는 입력과 출력중인 동안과 시스템에 저장될 때 모두 엿보는 사람들로부터 숨겨져야 한다. 기밀을 다루는 정보는 확실히 신용카드 넘버, 계좌 잔액과 집주소를 포함하며 많은 애플리케이션에서는 이름, 이메일 주소와 다른 개인 정보도 또한 포함한다.

웹기반 애플리케이션들은 기밀을 다루는 정보를 포함해서 사용자와의 모든 통신을 암호화해야 한다; 흔한 방법은 (SSL 또는 TLS 위에서 HTTP 가 작동하는) https: 프로토콜을 사용하는 것이다. HTTP 1.1 스펙 (IEFT RFC 2616 15.1.3 절) 에 따르면 HTTP 프로토콜을 사용하는 서비스 사용자들은 기밀을 다루는 데이타를 전송하기 위해 GET 기반 폼들을 사용하지 않아야 한다. 왜냐하면 이것이 데이타가 요청-URI 로 인코드되게 할 수 있기 때문이다. 많은 기존 서버들, 프락시와 사용자 에이전트들은 요청 URI 를 제삼자에게 보일 수 있을 지도 모르는 어떤 곳에 기록할 것이다. 대신 이 목적을 위해 의도된 POST 기반 전송을 사용해라.

이러한 기밀을 다루는 데이타의 데이타베이스들도 또한 디스크상의 파일들과 같은 모든 저장 디바이스에서 암호화되어야 한다. 이러한 암호화가 물론 보안적인 애플리케이션을 깨뜨리는 공격자에 대해서는 보호를 하지 못하며 이는 애플리케이션 또한 암호화된 데이타에 접근하는 방법을 가져야 하기 때문이다. 그러나 암호화는 데이타의 백업 디스크를 어떻게든 얻었지만 이들을 복호화하는데 필요한 키를 얻지못한 공격자들에 대해 상당한 보호를 제공한다. 공격자가 애플리케이션으로 어떻게든 침입하는 것이 아니라 저장된 데이타를 보기에 그저 충분할만큼 부분적으로 관련 시스템내로 침입한다면 암호화는 또한 상당한 보호 방법을 제공한다 - 공격자는 데이타를 얻기 위해 암호화 알고리듬을 깨뜨려야 한다. 데이타가 본의아니게 (예, 코어 파일) 전달될 수 있는 많은 상황이 있는데 암호화는 또한 이를 예방한다. 종종 서버 자체가 파괴되거나 깨뜨려질 수 있기 때문에 암호화가 생각하는 만큼 강력한 보호 방법은 아니라는 것은 언급할만한 가치가 있다.