GET 쿼리 문자열로 민감 정보 전달

Use of GET Request Method with Sensitive Query Strings

설명

애플리케이션이 비밀번호, 토큰, API Key 같은 민감 정보를 URL의 쿼리 문자열로 주고받을 때 발생합니다. URL은 브라우저 히스토리, 서버/프록시 로그, 즐겨찾기, 캐시, 그리고 Referer 헤더 등에 자동으로 남기 때문에 쉽게 노출됩니다. GET 핸들러에서 req.query로 이러한 값을 읽도록 설계하면 잘못된 사용을 고착화하여 정보 노출 위험을 크게 키웁니다. 공격자는 공유된 링크, 로그·모니터링 시스템 접근, 제3자 리소스 로드 시 Referer 유출 등을 통해 민감값을 획득해 계정 탈취, 세션 하이재킹, API 남용을 시도할 수 있습니다.

잠재적 영향

  • 민감정보 노출: URL이 여러 저장 지점(브라우저 히스토리, 서버/프록시 로그, 모니터링, 캐시, Referer 헤더)에 남아 비밀번호·토큰이 유출될 수 있음

  • 계정/세션 탈취: 탈취한 비밀번호·액세스 토큰을 재사용하여 계정 접속 또는 세션 하이재킹 가능

  • 무단 API 사용: 노출된 API Key/Access Token으로 대량 호출, 데이터 수집, 과금 피해 유발

해결 방법

  • 설계: 민감 정보는 절대 GET 쿼리로 전달하지 말고 POST 본문(req.body) 또는 적절한 헤더(Authorization: Bearer )로 전달

  • 라우팅: app.get 대신 app.post 사용, 서버에서 req.query가 아닌 req.body 또는 헤더로 읽기

  • 전송: 항상 HTTPS 사용으로 전송 구간 보호

  • 로깅/모니터링: URL 전체 로깅 금지, 쿼리 파라미터 마스킹/제거, 리버스 프록시/로그 수집기 설정 포함

  • 방어적 처리: GET 요청에서 password/token/api_key 등이 감지되면 400으로 거부하고 올바른 사용법 안내

  • 리다이렉트/링크: 리다이렉트 URL과 앵커/링크에 민감값 포함 금지, 폼은 method="POST" 사용

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

취약한 코드

안전한 코드

설명:

  • 취약한 코드: GET 요청에서 req.query.password를 읽으면 비밀번호가 URL에 포함되어 브라우저 히스토리, 서버/프록시 로그, Referer 헤더 등에 저장됩니다. 이 흔적을 통해 공격자가 민감 정보를 쉽게 획득할 수 있습니다.

  • 안전한 코드: 민감 정보는 GET 쿼리가 아닌 POST 본문(req.body) 또는 Authorization 헤더로 전달하여 URL에 남지 않게 합니다. 이로써 로그/히스토리/Referer 등 2차 저장 경로에 노출될 위험을 크게 줄입니다.

참조

Last updated