WinHTTP 보안 고려 사항
WinHTTP를 사용하는 애플리케이션에는 다음과 같은 보안 고려 사항이 적용됩니다.
- 서버 인증서는 세션당 한 번만 확인됩니다. 인증서를 확인한 후에는 현재 세션 동안 유효한 상태로 유지됩니다. 인증서 지문이 일치하여 인증서가 변경되지 않았다는 것을 나타내는 한 인증서의 유효성은 계속 다시 검사됩니다. 따라서 프로토콜, 해지 확인 또는 인증서 오류 무시 플래그를 통해 유효성 검사 조건의 변경은 인증서가 확인되면 적용되지 않습니다. 이러한 변경 내용이 즉시 적용되도록 하려면 현재 세션이 종료되고 새 세션이 시작되어야 합니다. 마찬가지로, 세션 중에 인증서의 만료는 애플리케이션 자체가 인증서 서버를 주기적으로 검사하여 만료 데이터를 검색하는 경우에만 검색할 수 있습니다.
- 자동 프록시에는 스크립트 다운로드 및 실행이 포함됩니다. 자동 프록시 검색 지원에는 DHCP 또는 DNS를 통해 검색하고, Java 스크립트와 같은 프록시 스크립트를 다운로드하고 실행하는 작업이 포함됩니다. 더 높은 수준의 보안을 달성하려면 애플리케이션에서 WINHTTP_AUTOPROXY_RUN_INPROCESS 플래그를 전달하지 않아야 하므로 자동 프록시 검색이 out-of-process에서 시작됩니다. 그럼에도 불구하고 WinHTTP는 스크립트가 제대로 out-of-process를 실행하지 못하는 경우 기본적으로 프로세스 내 자동 프록시 스크립트를 실행하려고 시도합니다. 이 대체 동작이 용납할 수 없는 위험을 초래한다고 생각되면 WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY 플래그를 사용하여 대체 동작을 사용하지 않도록 설정합니다.
- WINHTTP_STATUS_CALLBACK 함수는 즉시 반환해야 합니다. 이러한 콜백 함수 중 하나를 작성할 때는 차단하지 않도록 주의해야 합니다. 예를 들어 콜백이나 호출하는 함수는 사용자 대화 상자를 표시하거나 이벤트를 기다리지 않아야 합니다. WINHTTP_STATUS_CALLBACK 함수가 차단되는 경우 WinHTTP의 내부 일정에 영향을 미치며 동일한 프로세스 내의 다른 요청이 서비스를 거부합니다.
- WINHTTP_STATUS_CALLBACK 함수는 재진입해야 합니다. 콜백을 작성할 때 재진입 시 안전하지 않은 정적 변수 또는 기타 구문을 방지하고 재진입하지 않는 다른 함수를 호출하지 않습니다.
- 비동기 작업이 가능한 경우 OUT 매개 변수에 대해 NULL을 전달합니다. 콜백 함수를 등록하여 비동기 작업을 사용하도록 설정한 경우 WinHttpQueryDataAvailable의 경우 lpdwDataAvailable, WinHttpReadData의 경우 lpdwBytesRead 또는 WinHttpWriteData용 lpdwBytesWritten와 같은 OUT 매개 변수에 대해 항상 NULL 값을 전달합니다. 경우에 따라 작업이 완료되기 전에 호출 스레드가 종료되고 OUT 매개 변수가 NULL이 아니면 함수가 이미 해제된 메모리에 쓰게 될 수 있습니다.
- 여권 인증은 완벽하지 않습니다. 쿠키 기반 인증 체계는 공격에 취약합니다. Passport 버전 1.4는 쿠키 기반이므로 쿠키 또는 양식 기반 인증 체계와 관련된 취약성이 적용됩니다. Passport 지원은 WinHTTP에서 기본적으로 사용하지 않도록 설정됩니다. WinHttpSetOption을 사용하여 사용하도록 설정할 수 있습니다.
- 기본 인증은 보안 연결을 통해서만 사용해야 합니다. 사용자 이름과 암호를 명확한 텍스트로 보내는 기본 인증(RFC 2617 참조)은 암호화된 SSL 또는 TLS 연결을 통해서만 사용해야 합니다.
- 자동 로그온 정책을 "낮음"으로 설정하면 위험이 발생할 수 있습니다. 자동 로그온 정책이 낮게 설정된 경우 사용자의 로그온 자격 증명을 사용하여 모든 사이트에 대해 인증할 수 있습니다. 그러나 신뢰하지 않는 사이트에 대해 인증하는 것은 좋은 보안 방법이 아닙니다.
- 명시적으로 사용하도록 설정하지 않는 한 SSL 2.0 연결은 사용되지 않습니다. TLS 1.0 및 SSL 3.0 보안 프로토콜은 SSL 2.0보다 더 안전한 것으로 간주됩니다. 기본적으로 WinHTTP는 SSL 2.0이 아닌 SSL 연결을 협상할 때 TLS 1.0 또는 SSL 3.0을 요청합니다. WinHTTP의 SSL 2.0 지원은 WinHttpSetOption을 호출해야만 사용할 수 있습니다.
- 인증서 해지 검사를 명시적으로 요청해야 합니다. 기본적으로 인증서 인증을 수행할 때 WinHTTP는 서버의 인증서가 해지되었는지 여부를 확인하지 않습니다. WinHttpSetOption을 사용하여 인증서 해지 검사를 사용하도록 설정할 수 있습니다.
- 애플리케이션은 세션이 단일 ID에 매핑되도록 해야 합니다. WinHTTP 세션은 하나의 ID에만 매핑되어야 합니다. 즉, WinHTTP 세션은 인증된 단일 사용자 또는 익명 사용자 그룹의 인터넷 활동을 관리하는 데 사용됩니다. 그러나 WinHTTP는 이 매핑을 자동으로 적용하지 않으므로 애플리케이션은 단일 ID만 포함되도록 조치를 취해야 합니다.
- WinHTTP 요청 핸들에 대한 작업을 동기화해야 합니다. 예를 들어 애플리케이션은 다른 스레드가 요청을 보내거나 받는 동안 한 스레드에서 요청 핸들을 닫지 않아야 합니다. 비동기 요청을 종료하려면 콜백 알림 중에 요청 핸들을 닫습니다. 동기 요청을 종료하려면 이전 WinHTTP 호출이 반환되면 핸들을 닫습니다.
- 추적 파일에는 중요한 정보가 포함됩니다. 추적 파일은 ACL(Access-Control Lists)을 사용하여 보호되므로 일반적으로 로컬 관리자 또는 파일을 만든 사용자 계정에서만 액세스할 수 있습니다. 무단 액세스로 인해 추적 파일이 손상되지 않도록 합니다.
- WinHttpSetOption을 통해 중요한 데이터를 전달하지 않습니다. 사용되는 인증 체계를 제어할 수 없고 중요한 데이터를 예기치 않게 명확한 텍스트로 보낼 수 있으므로 WinHttpSetOption 에 사용자 이름, 암호 또는 기타 자격 증명을 제공하지 마세요. 자격 증명을 설정하기 위해 WinHttpSetOption 대신 WinHttpQueryAuthSchemes 및 WinHttpSetCredentials를 사용합니다.
- 자동 리디렉션은 보안 위험을 초래할 수 있습니다. 기본적으로 리디렉션(302 메시지)은 POST에서도 자동으로 수행됩니다. 가짜 리디렉션의 가능성을 방지하기 위해 애플리케이션은 중요한 정보를 게시할 때 자동 리디렉션을 사용하지 않도록 설정하거나 콜백에서 방향을 다시 모니터링해야 합니다.
- 사용자 정의 헤더는 변경되지 않은 리디렉션 간에 전송됩니다. WinHTTPAddRequestHeaders를 사용하여 추가된 쿠키와 같은 사용자 정의 헤더는 수정 없이 리디렉션 간에 전송되고 WinHTTP에서 생성된 헤더는 자동으로 업데이트됩니다. 리디렉션 간에 사용자 정의 헤더를 전송하면 보안 위험이 발생하는 경우 WINHTTP_CALLBACK_STATUS_REDIRECT 완료와 함께 WINHTTP_STATUS_CALLBACK 콜백을 사용하여 리디렉션이 발생할 때마다 해당 헤더를 수정합니다.
- WinHTTP는 동기 모드에서 재진입되지 않습니다. WinHTTP는 동기 모드에서 재진입되지 않으므로 WinHTTP 함수 내에서 실행되는 애플리케이션 스레드에서 WinHTTP를 호출할 수 있는 APC(비동기 프로시저 호출)를 예약하지 마세요. 동기 모드에서 WinHTTP는 "경고 가능 대기"를 수행하고 대기 스레드가 APC를 실행하기 위해 선점된 다음 나중에 WinHTTP를 다시 입력하면 WinHTTP의 내부 상태가 손상될 수 있습니다.