[HTTP] Why, How - GET방식과 POST방식 그리고 쿼리 스트링(쿼리 파라미터).

하쮸·2025년 1월 6일

Error, Why, What, How

목록 보기
12/68
  • 쿼리스트링이 무엇이고 어떤식으로 사용되는 지, HTTP Method인 POST, GET의 특징과 장단점이 무엇이 있는 지에 대해서 공부하며 작성한 글.

1. 쿼리 스트링.(Query String)

  • 쿼리스트링(Query String)이란?

    • 지정된 매개변수할당하는 URL의 일부.
    • 일반적으로 물음표(?)시작하여 key-value 쌍으로 이루어짐.
      • 각 쌍은 엠퍼샌드(&)구분하고 각 쌍 내에서 키와 값등호(=)연결됨.
  • Ex)

    • https://www.example.com/page?param1=value1&param2=value2
    • 여기서 쿼리스트링?param1=value1&param2=value2임.
  • 쿼리 스트링은 서버로 데이터전송해서 응답맞춤화(customize)함.

    • 응답을 맞춤화한다는 말은, 즉 서버클라이언트(브라우저나 애플리케이션)로부터 받은 데이터기반으로 클라이언트의 요청에 맞는 맞춤형 응답제공한다는 의미임.
    • Ex) 쿼리 스트링은 검색어를 전달하거나, 제품의 정렬 순서를 지정하거나, 여러 페이지로 구성된 항목 목록의 현재 페이지 번호를 나타냄.

1-1. 쿼리 스트링 취약점

  • 정보 노출.(Information disclosure.)

    • 쿼리 스트링은 브라우저의 주소 표시줄, 북마크, 방문 기록에 표시됨.
    • 쿼리 스트링에 비밀번호, 인증 토큰, 개인 식별 정보와 같은 민감한 데이터가 포함될 경우, 해당 URL에 접근할 수 있는 누구나 이 정보를 볼 수 있음.
  • URL 길이 제한.(URL length limitations.)

    • 브라우저와 서버는 종종 최대 URL 길이 제한을 가짐.
      • 일반적으로 약 2000자.
    • 쿼리 스트링에 대량의 데이터를 넣어서 요청을 보내면 이 한계를 초과하여 서버 오류나 데이터 손실이 발생할 수 있음.
  • 웹 서버 로그 노출.(Web server log exposure.)

    • 웹 서버는 일반적으로 액세스된 URL을 쿼리 스트링과 함께 기록함.
    • 쿼리 스트링에 보안처리가 되지 않은 민감한 정보가 포함되면 서버 로그에 저장되어 데이터 유출의 원인이 될 수 있음.
  • 조작.(Manipulation.)

    • 사용자나 공격자(악의적인 사용자)가 쿼리 스트링을 쉽게 수정할 수 있고 애플리케이션이 이를 검증하거나 필터링하지 않을 경우 이를 악용할 수 있음.
  • 비효율적인 데이터 전송.(Inefficient data transmission.)

    • 쿼리 스트링을 통해 대량의 데이터를 전송하는 것은 POST 요청을 사용하는 것보다 비효율적임.
      • POST는 더 큰 페이로드(전송되는 데이터 중 근복적인 목적이 되는 데이터)를 처리할 수 있음.
  • 크로스 사이트 스크립팅 (XSS, Cross-site Scripting).

    • 웹 애플리케이션이 쿼리 스트링 데이터를 적절히 검증하거나 이스케이프하지 않고 웹페이지에 표시하면 XSS 공격에 취약해질 수 있음.
      • XSS란? : 공격자가 스크립트를 이용하여 사용자의 브라우저에서 악의적인 동작을 수행하는 것.
    • 공격자는 쿼리 파라미터를 통해 악성 스크립트를 주입한 뒤 이것이 사용자의 브라우저에서 실행됨.
  • SQL 삽입(SQL injection).

    • 애플리케이션이 적절한 검증 및 매개변수화 없이 데이터베이스 쿼리에서 필터링 되지 않은(raw) 쿼리 문자열 데이터를 사용하는 경우 SQL 주입 공격에 취약할 수 있음.
  • 크로스 사이트 요청 위조 (CSRF, Cross-Site Request Fogery).

    • CSRF란? : 공격자가 사용장의 인증 정보를 이용해서 다른 사이트에 악의적인 요청을 보내는 것.
    • 중요한 작업에 쿼리 스트링을 사용하는 경우, 공격자가 악성 URL을 생성하여 사용자가 클릭하면 로그인된 사용자 대신 웹사이트에서 원치 않는 작업을 수행할 수 있습니다.
    • 중요한 작업에 쿼리스트링을 사용할 경우, 공격자가 악성 URL을 쉽게 생성할 수 있고 이걸 무심코 사용자가 해당 URL을 클릭하면, 로그인된 사용자를 대신하여 웹사이트에서 원치 않는 작업이 수행될 수 있음.

2. 쿼리 파라미터.(Query Parameter)

  • 쿼리(Query)는 '문의' or '물음표'라는 뜻을 가지고 있음.

  • 쿼리 파라미터(Query Parameter)URL 뒤에 물음표(?)기호와 함께 붙는 키-값(Key-Value) 쌍을 뜻함.

    • 여러 개쿼리 파라미터를 전달하려면 파라미터 사이에 앰퍼샌드(&)를 추가해서 각 쿼리 파라미터를 연결하여 하나의 문자열(string)로 전달하면 됨.
      • 이를 쿼리 스트링(Query String)이라 함.
    • 쿼리 파라미터로는 문자열뿐만 아니라 숫자, 리스트, 불리언 등 다양한 형태의 데이터를 넣을 수 있음.
  • 쿼리 파라미터는 다양한 용도가 있는데 그 중 대표적인 게 웹 서버의 요청에 대한 추가 정보를 제공하고, 전달된 데이터로 서버가 추가 액션을 취할 수도 있음.

  • Ex)

  • 쿼리 파라미터가 4개 들어 있음.

    • 1번째 파라미터는 paymentType(key) = NORMAL(value)이고 나머지 파라미터도 전부 같은 구조로 되어 있음.
  • 쿼리 파라미터는 클라이언트에서 서버로 간단히 데이터를 전달하고 싶을 때 유용함.

    • Ex) 토스페이먼츠 결제 연동에서는 클라이언트로 전달된 paymentType 쿼리 파라미터 값에 따라 서버에서 다른 API를 호출해야 됨.

2-1. 사용되는 곳.

  • 쿼리 파라미터는 다양한 용도로 사용할 수 있음.
  1. API 요청
    • API 엔드포인트에 쿼리 파라미터를 붙이면 주로 결과를 조회하거나 필터링하는 데 사용됨.
    • Ex) 토스페이먼츠 거래 조회 API는 쿼리 파라미터로 조회할 기간을 설정할 수 있음.
    • curl --request GET \
      --url 'https://api.tosspayments.com/v1/transactions?startDate=2022-01-01T00:00:00&endDate=2022-01-10T23:59:59' \
      --header 'Authorization: Basic dGVzdF9nc2tfZG9jc19PYVB6OEw1S2RtUVhrelJ6M3k0N0JNdzY6'
    • 엔드포인트 URL 뒤에 startDate, endDate 키를 붙이면 됨.
    • Body 파라미터보다 더 간단하게 파라미터를 넘길 수 있어서 사용됨.
  2. 검색
    • 많은 검색 엔진이 쿼리 파라미터를 사용함.
    • Ex) 구글 검색 결과 페이지의 URL을 자세히 보면 쿼리 파라미터가 여러 개 붙어있음.
    • 검색 쿼리를 서버에 전달하고 결과를 필터링하는 역할을 함.
  3. 트래킹
    • 쿼리 파라미터는 어떤 경로로 방문자가 사이트를 접속하는지 트래킹하는 데도 사용됨.
    • 대표적으로 UTM 파라미터 방법.
      • 특정 링크에 UTM 파라미터를 추가해놓고 방문자의 유입경로를 간편하게 확인할 수 있음.

3. HTTP 내용 복습


3-1. POST 방식.

  • POST 방식데이터서버로 보내서 추가 or 수정하기 위해서 사용하는 방식.

  • POST방식의 특징

    • URL변수(데이터)노출하지 않고 요청함.
      • URL에 데이터가 노출되지 않아서 기본적인 보안이 되어있음.
    • 데이터Body(바디)에 포함시킴
    • 캐싱할 수 없음.
  • GET방식데이터URL에 넣어서 전송하는 반면에 POST방식BODY에 데이터를 넣어서 전송함.

    • 그래서 헤더필드 중 Body의 데이터를 설명하는 Content-Type이라는 헤더 필드가 들어가고 어떠한 데이터 타입인지를 명시해주어야 함.
    • 데이터를 Body에 포함시키는 이점 때문에 메세지 길이의 제한은 없지만 최대 요청을 받는 시간인 Time Out이 존재하므로 클라이언트에서 페이지를 요청하고 기다리는 시간이 존재.
  • POST 방식URL에 데이터가 노출되지 않으므로 즐겨찾기나 캐싱이 불가능하지만 쿼리스트링(문자열)데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송이 가능.


3-2. GET 방식.

  • GET 방식은 어떠한 데이터를 가져와서 조회하기 위해서 사용하는 방식. 
  • GET방식의 특징
    • URL변수(데이터)를 포함시켜 요청.
      • URL에 데이터가 노출되어 있어서 보안에 취약함.
    • 데이터Header(헤더)에 포함하여 전송.
    • 캐싱할 수 있음.
  • GET 방식은 간단한 데이터를 URL에 삽입한 형태로 설계된 방식으로, 데이터를 보내는 양에 한계가 있음.
    • HTTP 자체는 GET 방식의 URL 길이에 따로 제약을 두고 있지는 않지만, 브라우저에서 최대 길이제한하고 있으며 URL형식에 맞지 않는 파라미터 이름이나 값은 인코딩되어 전달해야 함.
      • 만약에 보내는 길이가 너무 긴 경우에 초과된 데이터는 전송되지 않음.
    • 특별히 전송하는 데이터가 없으므로 GET 방식에서 바디(body)는 보통 빈 상태전송이 됨.
      • 헤더의 내용 중 Body데이터를 설명하는 Content-type 헤더필드도 들어가지 않음. 
  • Ex) 로그인 페이지에서 로그인을 하는 상황.
    • ID와 PW를 입력한 후 로그인 요청을 보냄.
      • 요청을 GET방식으로 전송하는 경우에 www.google.com/login?id=naver&pw=daum 와 같은 페이지가 있다고 가정.
      • 여기서 GET방식은 ?(물음표)기호를 통해 URL의 끝을 알리고, ID (키, Key)에 대해 naver (값, Value)을, PW (키, Key)에 대해 daum (값, Value)전송하는 것.
  • 여러개Key-Value보내는 경우에 엠퍼샌드(&)를 사용하여 이어주는 GET방식은 최소한의 보안도 없이 값을 그대로 보여주기 때문에 실제 웹사이트에서 ID와 PW같은 민감한 정보GET 방식으로 사용하면 개인정보가 노출되는 문제가 발생함.
  • GET 방식을 사용해서 데이터를 노출시키는 경우는 개인정보가 포함되지 않는 상황에서 캐싱을 하여 속도를 높이거나 즐겨찾기를 편리하기 위해 사용되는 경우가 많음.
    • 어떤 물건 A를 즐겨찾기에 추가할 때, 그 물건의 이름을 URL에 쿼리 파라미터로 포함시켜서 서버에 요청을 보내는 식으로 즐겨찾기를 생성할 수 있음.

4-1. 캐싱(Caching)

  • 한 번 접근한 후, 또 다시 요청할시 빠르게 접근하기 위해서 레지스터에 데이터를 저장시켜 놓는 것.

5. POST, GET 요약.

-POST 방식GET 방식
URL에 데이터 노출유무XO
URL 예시http://localhost:8080/loginhttp://localhost:8080/login?username=hajju&password=hajju123
데이터의 위치바디(Body)헤더(Header)
캐싱 가능 여부불가능가능

6. 참고.

profile
Every cloud has a silver lining.

0개의 댓글