두 방식 모두, 서버에 요청을 하는 메서드이다.
클라이언트가 서버에 요청을 할때, 제공해야 하는 자원이 있다고 하자.
예를 들면, 어떤 홈페이지의 로그인 페이지에서 로그인을 하는 경우이다.
아이디 와 패스워드는 클라이언트가 작성한 후, 그 정보를 서버에 요청하여
클라이언트가 작성한 아이디와 패스워드가 올바른 것인지 검사를 해야한다.
위의 예시를 보듯, 요청에는 자원을 보내야 하는경우가 존재한다.
클라이언트의 데이터를 URL뒤에 붙여서 보낸다. 위에서 쓴 예시처럼 아이디 패스워드를 보낸다고 하면,
www.example.com?id=mommoo&pass=1234 (예시로 쓴 URL입니다. 존재하지 않습니다.)
이런식으로 보낸다. URL 뒤에 "?" 마크를 통해 URL의 끝을 알리면서, 데이터 표현의 시작점을 알린다.
데이터는 key 와 value 쌍으로 넣어야 한다 윗 예시에서의 key는 id 랑 pass고 value는 mommoo랑 1234가 되겠다.
중간에 &마크는 구분자 이다. 2개이상의 key - value 쌍 데이터를 보낼때는 &마크로 구분해준다.
URL에 붙이므로, HTTP패킷의 해더에 포함되여 서버에 요청한다.
따라서, GET 방식에서 BODY에 특별한 내용을 넣을 것이 없으므로 BODY가 빈상태로 보내진다.
그러므로, 헤더의 내용중 BODY 데이터를 설명하는 Content-Type이라는 헤더필드는 들어가지 않는다.
URL형태로 표현되므로, 특정 페이지를 다른사람 에게 접속하게 할 수 있다.
또한 간단한 데이터를 넣도록 설계되어, 데이터를 보내는 양의 한계가 있다.
먼저 GET 방식에 대해서 알아보도록 하겠습니다. 영어 Get이라는 단어는 가져오다라는 뜻을 가진 단어인데요, 이를 활용해서 이해하면 쉽습니다. 우리가 필요한 정보를 얻기 위해 도서관에서 책을 빌려 가져오는(GET)상황과 유사하게 GET은 어떠한 정보를 가져와서 조회하기 위해서 사용되는 방식입니다.
[ GET방식의 특징]
- URL에 변수(데이터)를 포함시켜 요청한다.
- 데이터를 Header(헤더)에 포함하여 전송한다.
- URL에 데이터가 노출되어 보안에 취약하다.
- 캐싱할 수 있다.
GET 방식은 간단한 데이터를 URL에 넣도록 설계된 방식으로 데이터를 보내는 양에 한계가 있습니다. HTTP 자체는 GET 방식의 URL 길이에 제약을 두고 있지는 않지만, 브라우저에서 최대 길이를 제한하고 있으며 URL형식에 맞지 않는 파라미터 이름이나 값은 인코딩되어 전달해야 합니다. (만약 여기서 보내는 길이가 너무 길은 경우 초과데이터는 절단됩니다.) 특별히 전송하는 데이터가 없으므로 GET방식에서 바디는 보통 빈 상태로 전송이 되며, 헤더의 내용 중 Body의 데이터를 설명하는 Content-type 헤더필드도 들어가지 않습니다.
이번에는 실제로 GET방식이 사용되는 방식에 대해 설명해보겠습니다. 예를 들어 우리가 어떤 페이지에서 로그인을 하는 상황이라고 하고, id와 pw를 입력한 후 엔터를 눌렀다고 칩시다. 이럴때 요청을 GET방식으로 전송하는 경우에는 www.mangkyu.com/login?id=mang&pw=kyu 와 같은 페이지가 있다고 가정을 합시다. 여기서 GET방식은 ?마크를 통해 URL의 끝을 알리고, id라는 키(Key)에 대해선 mang이라는 값(Value)를, pw라는 키(Key)에 대해서는 kyu라는 값(Value)를 전송하는 것을 볼 수 있습니다. 여러개의 Key와 Value를 보내는 경우에 &를 사용하여 이어주는 GET방식은 최소한의 보안유지도 하지 않기 때문에 실제 웹사이트에서 ID와 PW같은 중요한 정보를 GET방식으로 사용하면 개인정보가 노출되는 문제가 발생합니다. GET방식을 사용하여 데이터를 노출시키는 경우는 개인정보가 포함되지 않는 상황에서 *캐싱을 하여 속도를 높이거나 즐겨찾기를 편리하기 위해 사용되는 경우가 많습니다. 우리가 어떤 물건 a에 대해서 즐겨찾기를 추가하면 그 물건의 이름이 a라는 정보를 url에 추가하여 즐겨찾기를 생성할 수 있는 것입니다.
POST 방식은 GET 방식과 달리, 데이터 전송을 기반으로 한 요청 메서드이다.
GET방식은 URL에 데이터를 붙여서 보내는 반면, POST방식은 URL에 붙여서 보내지 않고
BODY에다가 데이터를 넣어서 보낸다.
따라서, 헤더필드중 BODY의 데이터를 설명하는 Content-Type이라는 헤더 필드가
들어가고 어떤 데이터 타입인지 명시한다.
컨텐츠 타입으로는 여러가지가 있지만, 몇가지를 적자면,
- application/x-www-form-urlencoded
- text/plain
- multipart/form-data
등이 있다.
따라서 POST 방식으로 데이터를 보낼때는 위와 같이 컨텐츠 타입을 꼭 명시해줘야한다.
보통 작성하지 않는 경우는 1번의 컨텐츠 타입으로 셋팅된다.
1번의 컨텐츠 타입은, GET방식과 마찬가지로 BODY에 key 와 value 쌍으로 데이터를 넣는다. 똑같이 구분자 &를 쓴다.
2번의 컨텐츠 타입은, BODY에 단순 txt를 넣는다.
3번의 컨텐츠 타입은, 파일전송을 할때 많이 쓰는데 BODY의 데이터를 바이너리 데이터로 넣는다는걸 알려준다.
자바와 같이 oop 프로그래밍에서는 BODY에 데이터를 InputStream/OutputStream 클래스를 통해서 읽고/쓰고 한다.
POST 방식은 데이터를 서버로 제출하여 추가 또는 수정하기 위해서 사용하는 방식입니다.
[ POST방식의 특징 ]
- URL에 변수(데이터)를 노출하지 않고 요청한다.
- 데이터를 Body(바디)에 포함시킨다.
- URL에 데이터가 노출되지 않아서 기본 보안은 되어있다.
- 캐싱할 수 없다.
GET방식은 URL에 데이터를 붙여서 전송하는 반면에 POST방식은 BODY에 데이터를 넣어서 전송합니다. 따라서 헤더필드 중 Body의 데이터를 설명하는 Content-Type이라는 헤더 필드가 들어가고 어떠한 데이터 타입인지를 명시해주어야 합니다. 데이터를 Body에 포함시키는 이점 때문에 메세지 길이의 제한은 없지만 최대 요청을 받는 시간인 Time Out이 존재하므로 클라이언트에서 페이지를 요청하고 기다리는 시간이 존재합니다. 실제로 상황에서 POST 방식은 URL에 데이터가 노출되지 않으므로 즐겨찾기나 캐싱이 불가능하지만 쿼리스트링(문자열)데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송이 가능합니다.