2020. 2. 13. 17:27ㆍIT-Network/Http
구글링한거 복사해다 놓음. 펌!
https://blog.naver.com/2000sky2/220619302087
https://simsimjae.tistory.com/218
오늘 포스팅 할 내용은,
Http 프로토콜이 제공해주는 7가지 메서드들 중
웹서비스 개발에 주로 사용하는,
GET 메서드와 POST 메서드에 대하여 기술한다.
GET메서드 POST메서드 란?
위에서 말했다시피, 웹 서비스 개발에 주로 사용하는 메서드 이다.
사용자가 URL을 브라우저 주소창에 작성하고 엔터를 누르면
원하는 웹페이지가 나온다. 사용자는 웹페이지를 보기위해 단순한 일을 한 것 이지만,
특정 웹페이지를 사용자 웹브라우저에게 보여주기 위해서는 내부적인 처리들이 있다.
그 내부적인 처리에서, 클라이언트가 서버에게 웹페이지를 보여달라고 말하는 것을
우리는 요청 이라 부르고, 서버가 클라이언트에게 요청받은 것에 대한 대답으로, 웹페이지
내용을 표현하기 위해 html문서로 주는것을 응답 이라 부른다.
HTTP 패킷
클라이언트가 서버로 요청을 했을때, 보내는 데이터를 HTTP 패킷이라 표현한다.
HTTP 프로토콜을 쓰므로, 앞에 HTTP가 붙고 인터넷을 통해 보내는 데이터를 패킷이라 표현하므로,
HTTP패킷 이라 부른다. HTTP패킷의 구조는 크게 헤더 와 바디로 나뉘어진다.
헤더에는 7가지 HTTP 메서드 방식중 무엇을 썻는지, 클라이언트의 정보, 브라우저 정보,
접속할 URL 등등 과 같은 클라이언트 정보를 담는다.
바디는 보통 비어있다. 하지만, 특정 데이터를 담아서 서버에게 요청을 보낼 수 있다.
이러한 웹 개념아래, 우리는 GET메서드와 POST메서드를 통해서 요청을 할 수 있다.
GET방식 vs POST방식
두 방식 모두, 서버에 요청을 하는 메서드이다.
클라이언트가 서버에 요청을 할때, 제공해야 하는 자원이 있다고 하자.
예를 들면, 어떤 홈페이지의 로그인 페이지에서 로그인을 하는 경우이다.
아이디 와 패스워드는 클라이언트가 작성한 후, 그 정보를 서버에 요청하여
클라이언트가 작성한 아이디와 패스워드가 올바른 것인지 검사를 해야한다.
위의 예시를 보듯, 요청에는 자원을 보내야 하는경우가 존재한다.
- GET방식으로 데이터를 보내기
클라이언트의 데이터를 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형태로 표현되므로, 특정 페이지를 다른사람 에게 접속하게 할 수 있다.
또한 간단한 데이터를 넣도록 설계되어, 데이터를 보내는 양의 한계가 있다.
- POST방식으로 데이터를 보내기
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 클래스를 통해서 읽고/쓰고 한다.
GET방식 과 POST방식에 대한 상식
- POST방식이 GET방식보다 보안측면에서 더 좋다?
POST든 GET이든 보내는 데이터는 전부 클라이언트측에서 볼 수 있다. 단지 GET방식은 URL에 데이터가 표시되여 별다른
노력없이 볼 수 있어서지, 두 방식 전부 보안을 생각한다면 암호화 해야한다.
- GET방식이 POST방식보다 속도가 빠르다?
빠른건 맞다. 하지만 왜 빠른지를 알아야 하는데, 이유는 GET방식의 요청은 캐싱(한번 접근 후, 또 요청할 시 빠르게 접근하기 위해
데이터를 저장시켜 놓는다)때문에 빠른것이다.
출처: https://mommoo.tistory.com/60 [개발자로 홀로 서기]
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
좀더 상세히 설명
https://blog.naver.com/2000sky2/220619302087
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
https://simsimjae.tistory.com/218
GET방식과 POST방식? |
GET방식이란 URL에 key&value 쌍의 형태로 서버에 정보를 전송한다. 그렇기 때문에 HTTP request 헤더에 Content-type이라는 헤더 필드는 필요하지 않다. 바디부분이 비어있다.
POST방식이란 사용자의 입력을 HTTP request 바디 부분에 넣어서 전송한다. 그렇기 때문에 HTTP 요청 헤더에 Content-type 필드를 명시해야 한다.
Content-type 필드는 다음과 같이 3가지의 MIME타입으로 구성되어 있다. MIME타입이란 초기 이메일 시스템에서 첨부파일의 타입을 명시할때 사용하던 타입이다. 바이너리 데이터를 아스키 코드로 변환할때 어떤 바이너리 데이터를 변환 했는지를 명시해야 수신측에서 다시 아스키코드->바이너리 데이터로 정확히 복호화 할 수 있다. 이 방법이 그대로 HTTP에서도 사용 된다. 자세한것은 이 포스트를 읽고 오길 바란다.
- application/x-www-form-urlencoded
- text/plain
- multipart/form-data
첫번째 컨텐츠 타입의 HTTP 바디 부분에는 GET방식과 마찬가지로 key&value 형태로 사용자의 입력이 들어가있다.
두번째 컨텐츠 타입의 HTTP 바디 부분에는 단순히 텍스트가 적혀있다.
세번째 컨텐츠 타입의 HTTP 바디 부분에는 동영상이나 사진의 바이너리 데이터가 들어가 있다.
GET방식의 장단점 |
|
GET방식은 사용자가 입력한 값이 url에 그대로 노출되므로 보안에 좋지않다.
하지만, 그 url을 다른 사람들과 공유할수 있으므로, 그 url을 그대로 입력해서 내가 보는 페이지는 남들도 똑같이 볼 수 있다.
또한 바이너리 데이터를 전송할수 없다.
GET방식은 요청에 대한 정보를 구분할때 속성=속성값&속성=속성값 이런식으로 KEY VALUE 쌍을 &연산자로 구분을 하게 되는데 바이너리 데이터는 &를 데이터로 취급할수 있기 때문에, GET방식으로는 바이너리 데이터를 전송할수 없게 된다.
-> 서로 다른 데이터간 구분이 불가능함.
따라서 바이너리 데이터는 무조건 POST방식으로 전송해야 한다.
GET방식을 사용하는 이유중 가장 큰 이유가 바로 다른 사람과의 URL공유 역할이다.
POST방식의 장단점 |
|
POST방식은 사용자가 입력한 입력값이 HTTL요청 BODY부분에 들어가기 때문에 사용자가 무엇을 입력했는지 다른사람들이 몰래 볼수가 없기 떄문에 보안에 좋다.
또한, 바이너리 데이터를 전송할수 있는데, 그 이유는 브라우저가 서로 다른 데이터간 구분을 알아서 해주기 때문이다.
GET방식의 경우 무조건 &를 통해서 서로 다른 데이터를 구분하는데, 바이너리 데이터는 &를 데이터로 취급하기 때문에
&가 아닌 형태로 데이터를 구분해야 한다.
브라우저는 사용자가 POST방식의 Multipart type 컨텐츠(사진,동영상)를 요청을 했을때, HTTP 바디 부분에는 데이터간 구분자를 임의로 만들게 되는데 예를 들면 다음과 같다.
name은 key, filename은 첨부 파일 이름(value)이다. post방식은 보내는 데이터의 양 제한이 없다.
멀티 파트에서 각 파트는 서로 다른 마임 타입을 갖는다. 즉, 서로 다른 타입으로 인코딩 된다는것이다.
GET vs POST? |
|
GET 방식
1. 속도가 빠르다.
2. URL 공유가 가능하다.
3. 입력값이 그대로 노출된다.
4. 데이터 전송 크기에 제한이 있다.
5. 바이너리 데이터 전송이 불가능하다.
POST 방식
1. 속도가 느리다. -> 바디 부분에 데이터를 담아야 하므로
2. 입력값이 노출되지 않는다.
3. 바이너리 데이터 전송이 가능하다.
GET방식과 POST방식은 장/단점을 모두 갖고 있기 떄문에 상호 보완적이다. 그렇기 때문에 지금 한가지만 사용되지 않고 두가지 방식이 모두 사용되고 있는 것이다. 상황에 따라 적절한 방식을 사용해야 한다.
예를들어, 게시판을 이동할때는 속도가 중요하며 입력값이 노출되어도 상관없다. 그렇기 때문에 GET방식을 사용하고,
회원가입할때 사용자의 입력값들은 노출되면 안되기 때문에 POST방식을 사용해야 한다.
POST방식은 안전하다? |
|
그렇지 않다. GET방식이든 POST방식이든 전달되는 데이터를 볼 수 있다. 다만, GET방식은 별 노력 없이도 URL에 인풋이 그대로 노출 되기 때문에 더 잘 노출된다는 차이일뿐이다.
출처: https://simsimjae.tistory.com/218 [104%]
'IT-Network > Http' 카테고리의 다른 글
http 응답 코드 의미 ( http response code ) (0) | 2020.03.19 |
---|