- 쿼리스트링이 무엇이고 어떤식으로 사용되는 지, HTTP Method인 POST, GET의 특징과 장단점이 무엇이 있는 지에 대해서 공부하며 작성한 글.
쿼리스트링(Query String)이란?
매개변수에 값을 할당하는 URL의 일부.물음표(?)로 시작하여 key-value 쌍으로 이루어짐.엠퍼샌드(&)로 구분하고 각 쌍 내에서 키와 값은 등호(=)로 연결됨.Ex)
https://www.example.com/page?param1=value1¶m2=value2쿼리스트링은 ?param1=value1¶m2=value2임.쿼리 스트링은 서버로 데이터를 전송해서 응답을 맞춤화(customize)함.
서버가 클라이언트(브라우저나 애플리케이션)로부터 받은 데이터를 기반으로 클라이언트의 요청에 맞는 맞춤형 응답을 제공한다는 의미임.Ex) 쿼리 스트링은 검색어를 전달하거나, 제품의 정렬 순서를 지정하거나, 여러 페이지로 구성된 항목 목록의 현재 페이지 번호를 나타냄.정보 노출.(Information disclosure.)
URL 길이 제한.(URL length limitations.)
웹 서버 로그 노출.(Web server log exposure.)
조작.(Manipulation.)
비효율적인 데이터 전송.(Inefficient data transmission.)
크로스 사이트 스크립팅 (XSS, Cross-site Scripting).
XSS란? : 공격자가 스크립트를 이용하여 사용자의 브라우저에서 악의적인 동작을 수행하는 것.SQL 삽입(SQL injection).
크로스 사이트 요청 위조 (CSRF, Cross-Site Request Fogery).
CSRF란? : 공격자가 사용장의 인증 정보를 이용해서 다른 사이트에 악의적인 요청을 보내는 것.쿼리(Query)는 '문의' or '물음표'라는 뜻을 가지고 있음.
쿼리 파라미터(Query Parameter)는 URL 뒤에 물음표(?)기호와 함께 붙는 키-값(Key-Value) 쌍을 뜻함.
여러 개의 쿼리 파라미터를 전달하려면 파라미터 사이에 앰퍼샌드(&)를 추가해서 각 쿼리 파라미터를 연결하여 하나의 문자열(string)로 전달하면 됨.쿼리 파라미터는 다양한 용도가 있는데 그 중 대표적인 게 웹 서버의 요청에 대한 추가 정보를 제공하고, 전달된 데이터로 서버가 추가 액션을 취할 수도 있음.
Ex)

쿼리 파라미터가 4개 들어 있음.
key) = NORMAL(value)이고 나머지 파라미터도 전부 같은 구조로 되어 있음.쿼리 파라미터는 클라이언트에서 서버로 간단히 데이터를 전달하고 싶을 때 유용함.
Ex) 토스페이먼츠 결제 연동에서는 클라이언트로 전달된 paymentType 쿼리 파라미터 값에 따라 서버에서 다른 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'검색Ex) 구글 검색 결과 페이지의 URL을 자세히 보면 쿼리 파라미터가 여러 개 붙어있음.트래킹POST 방식은 데이터를 서버로 보내서 추가 or 수정하기 위해서 사용하는 방식.
POST방식의 특징
URL에 변수(데이터)를 노출하지 않고 요청함.데이터를 Body(바디)에 포함시킴GET방식은 데이터를 URL에 넣어서 전송하는 반면에 POST방식은 BODY에 데이터를 넣어서 전송함.
Content-Type이라는 헤더 필드가 들어가고 어떠한 데이터 타입인지를 명시해주어야 함.메세지 길이의 제한은 없지만 최대 요청을 받는 시간인 Time Out이 존재하므로 클라이언트에서 페이지를 요청하고 기다리는 시간이 존재.POST 방식은 URL에 데이터가 노출되지 않으므로 즐겨찾기나 캐싱이 불가능하지만 쿼리스트링(문자열)데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송이 가능.
GET 방식은 어떠한 데이터를 가져와서 조회하기 위해서 사용하는 방식. 특징URL에 변수(데이터)를 포함시켜 요청.데이터를 Header(헤더)에 포함하여 전송.보내는 양에 한계가 있음.브라우저에서 최대 길이를 제한하고 있으며 URL형식에 맞지 않는 파라미터 이름이나 값은 인코딩되어 전달해야 함.초과된 데이터는 전송되지 않음.GET 방식에서 바디(body)는 보통 빈 상태로 전송이 됨.Body의 데이터를 설명하는 Content-type 헤더필드도 들어가지 않음. Ex) 로그인 페이지에서 로그인을 하는 상황.?(물음표)기호를 통해 URL의 끝을 알리고, ID (키, Key)에 대해 naver (값, Value)을, PW (키, Key)에 대해 daum (값, Value)을 전송하는 것.여러개의 Key-Value를 보내는 경우에 엠퍼샌드(&)를 사용하여 이어주는 GET방식은 최소한의 보안도 없이 값을 그대로 보여주기 때문에 실제 웹사이트에서 ID와 PW같은 민감한 정보를 GET 방식으로 사용하면 개인정보가 노출되는 문제가 발생함.데이터를 노출시키는 경우는 개인정보가 포함되지 않는 상황에서 캐싱을 하여 속도를 높이거나 즐겨찾기를 편리하기 위해 사용되는 경우가 많음.한 번 접근한 후, 또 다시 요청할시 빠르게 접근하기 위해서 레지스터에 데이터를 저장시켜 놓는 것.| - | POST 방식 | GET 방식 |
|---|---|---|
| URL에 데이터 노출유무 | X | O |
| URL 예시 | http://localhost:8080/login | http://localhost:8080/login?username=hajju&password=hajju123 |
| 데이터의 위치 | 바디(Body) | 헤더(Header) |
| 캐싱 가능 여부 | 불가능 | 가능 |