IT 그리고 정보보안/Knowledge base

HTTP (Hyper Text Transfer Protocol)

plummmm 2021. 4. 15. 22:26
반응형

이번에는 HTTP 프로토콜에 대해 한번 알아보자.

 

HTTP란?

Hyper Text Transfer Protocol의 약자로, 인터넷 상에서

웹 서버와 클라이언트가 통신할 때 필요한 프로토콜이다.

 

TCP기반의 응용 계층 프로토콜으로 TCP 3 ways handshaking 과정을 통해

TCP 세션이 맺힌 상태에서 동작한다.

보통 TCP라 하면 연결 지향형을 떠올리는데, HTTP는 통신이 끝나면 바로

서버와 클라이언트의 접속이 끊긴다. 그래서 비연결 지향형이라고 함.

 

또한 HTTP는 암호화 되지않은 Plain text 즉, 평문 전송을 한다. 보안에 취약함.

(그래서 HTTPS 라는게 나오는데 그거는 다음에 설명하겠음.)

 

한가지 더, HTTP 메세지는 단방향성 특징을 가지고 있다.

이말이 무슨 말이냐.. 서버에게 요청한 사용자가 누가 누군지 구분을 못한다는 말이다.

그래서 모든 요청을 동일하게 처리한다. 이것이 단방향성이다.

그래서 사용자 마다 다른 처리를 하고 싶다면 인증과정을 거쳐야 한다. 인증 부분은 다음에 포스팅하겠음.

 

흠.. 두서없이 그냥 계속 설명을 하긴 했는데. 정리를 하자면,

HTTP 특징

1. 인터넷을 사용할 때 필요한 7 응용 계층 프로토콜이다.

2. TCP기반 이지만 비연결 지향형 프로토콜이다.

3. 평문 전송을 한다. (메세지 기반으로 동작한다.)

4. 단방향성 특징을 갖는다.

 

정도가 되겠다.

그라먼 이제 HTTP 응답, 요청 메세지에 대하여 한번 알아보겠음

 

위 그림은 HTTP 요청, 응답 메세지의 구조이다. 구조를 아는게 왜 중요하냐.?

paros나 burp suite 같은 툴을 이용하여 HTTP 패킷을 스니핑 했을 때 뭔말인지 못알아 먹으면 정말 골치아프다.

구조를 공부하고 나면 어떤 내용인지 쉽게 파악할 수 있다.

보통 웹 해킹 공부를 하면 파로스 잡아서 필요한 내용만 보고 나머지 내용은 뭔지 관심도 없다.

나도 공부를 그런 식으로 했는데.. 정말 주먹구구식 방법이며 몇달 지나면 머리에 남는 것도 없다.

 

일단 요청 메세지부터 알아보자.

 

HTTP Request

말그대로 HTTP 요청이다. 클라이언트 측에서 웹 서버로 전송하는 메세지로,

사용자가 서버에 있는 자원을 요청하여 작업할 때 일어난다.

 

HTTP Request 메세지의 구조는 총 4가지로 구분된다. 위에 그림을 보아 알겠지만..

요청라인, 헤더, 공백, 바디 이렇게 4가지 이다. (헤더들은 일단 묶었다. 그리고 그림과 같은 순서와 다를 수있다. 없을 수도 있고.)

 

여서 좀 중요한게, 각 항목들은 CRLF 즉, 윈도우에서 치는 엔터를 기준으로 구분된다.

나중에 취약점 공부 들어가면, CRLF를 이용한 공격도 있으니 숙지해둘 필요가 있다.

 

먼저 요청라인을 보자.

요청라인은 Method / URL / 버젼 으로 구성되어 있다.

메소드는 단어 뜻 그대로 방법, 어떠한 방식으로 서버에 자원을 요청하는 지를 나타낸다.

여러가지 메소드들이 있는데 표에 정리를 해서 한번 보겠다.

 

위와 같이 여러가지 메소드들이 있다. 하지만 실제로 사용하는 메소드는 

GET과 POST라고 보면 된다. 이 둘의 차이를 아는 것이 좀 중요함.

 

전공이 컴퓨터과라서 학교 강의시간에 들었거나, 혹은 웹에 대해 좀 공부해본 사람들은

GET과 POST의 차이를 이렇게 알고 있따. (나도 그랬다.)

 

『GET은 URL에 요청 정보를 담아 전송하고, 바디부분은 아무것도 없다. URL에 요청 정보를 담으니 글자수 제한이 있다.

   POST는 바디 부분에 요청 정보를 담아 전송한다. 글자수 제한이 없어 게시판 글 작성 등에 쓰인다.』

 

이렇게 알고 있는 사람이 대부분이다. 뭐 딱히 틀린 말은 아니지만,

가령 이렇게 알고 있는 사람들에게.." GET과 POST의 차이점이 무엇인가요? " 혹은

" 언제 GET을 쓰고 언제 POST를 쓰는지 자세히 설명좀 해주세요 " 라고 말한다면

위에 나온 설명 대로, 전달할 양이 많으면 POST , 적으면 GET

파라미터를 넘겨서 게시물을 불러올 때는 GET, 게시물을 작성할 때는 POST 라고 말할 것이다.

 

그럼 전달할 양이 적을 때 POST는 못쓰나요? 아니요.

근데 왜 굳이 두가지를 나누어 둔 거죠? .....

 

이 때 부터 멘탈이 조금씩 부식되기 시작할 것이다.. ㅎㅎ

하지만 이 두가지의 중요한 차이를 간과하고 있기 때문에 헷갈리는 거임.

 

GET은 서버에서 데이터를 "불러오는 것" 이고

POST는 서버의 데이터를 "수정하는 것" 이다.

 

이렇게 설명하면 대부분의 사람들은 부식된 멘탈이 조금 회복될 것이다.

GET은 서버에 있는 데이터 즉, 우리가 사용하는 인터넷 홈페이지의 게시물 같은 것들을 열람할 때 즉,

서버 데이터 있는 그대로를 볼 때 사용한다. GET으로 서버 데이터에 대한 수정은 불가능하다.

반면 POST는 서버 데이터를 수정한다. 게시물 작성 같은 경우 서버의 DB를 수정해야만 한다. 그래서

게시물 작성할 때 POST를 쓰는것. 양이 많아서도 있지만 근본적인 이유는 이것이다.

 

나머지 메소드들은 어떤 기능인지 숙지만 하고 있으면 그때 그때 상황에 따라 참고하여 보면 됨.

PUT 이나 DELETE 같은 경우는 주로 첨부파일이 있을 때 사용함.

 

URL은 말그대로 사용자가 요청하는 목적지 서버의 자원을 나타내는 지표.

버젼은 HTTP 버젼을 나타낸다.

 

그밑 헤더 부분에는 메세지에 대한 정보가 담겨 있다.

위에서 말했듯이 헤더는 3가지 종류가 있다.

 

General Header- 클라이언트, 서버 또는 HTTP와 관계된 정보

Request Header- 요청 형식과 서버의 매개 변수

Response Header- 응답을 보내는 서버에 대한 정보

 

Request 메세지 예제를 보면서 설명하겠음.

 

 

[Accept : type / subtype] : 클라이언트가 받아들이는 미디어의 우선순위를 나타내는 것이다. (Request Header)
[Accept-Language : 언어종류] : 클라이언트가 우선적으로 지원하는 언어를 나타낸다. (Request Header)

[Accept-Encoding: 인코딩 타입] : 클라이언트가 수용가능한 인코딩 타입을 나타낸다. (Request Header)

[User-Agent : 브라우저 명] : 응답가능한 웹 브라우져의 종류 (Request Header)

[Host : 호스트:포트] : 응답을 요청한 호스트 서버 (Request Header)

[Proxy-Connection : Keep-Alive ] : 프록시 연결 사용 (Request Header)

[Pragma : no-cache] : 프록시 시스템에 대한 지시문을 나타낸다. no-cache만 설정함. (General Header)
[Cookie : 이름=값] : 클라이언트가 가지고 있는 쿠키 (Request Header)
 

이정도가 되겠다. (표에 그리려다.. 생각보다 포스팅이 길어져서 좀 지쳤음 -_-;)

위에 HTTP 구조 그림과 순서가 다를 수 있다.

솔직히 Request Header 인지 General Header 인지 구분하는거 의미 없긴 한데, 기왕 공부하는거 자세히 알면 좋잖아?

 

다음은 CRLF.

C언어 공부 한 사람은 캐리지 리턴, 라인피드가 뭔지 알지?

안한 사람은 C언어 부터 하고 오도록 하고...

윈도우에서의 엔터키 입력했을 때를 말하는거임.

이 캐리지리턴 라인피드를 기준으로 헤더와 바디를 나눈다.

 

고다음 Body.

본문 즉, 클라이언트가 전송하고자 하는 메세지들이 담기는 곳이다. GET 메소드를 사용한다면 아마 비어 있을 것이고

POST를 사용한다면 이곳에 메세지들이 기재됨.

 

Request에 관한 내용은 이정도면 충분하지 싶다. 그다음 Response 메세지를 알아보자.

 

 

HTTP Response

응답하라 1994 ㅎㅎㅎ 죄송, 요청에 응답하는 메세지임.

긴 설명 필요없이 바로 구조를 보자.

 

먼저 상태라인이다. HTTP / 버젼 / 응답코드 로 구성되어있다. 

버젼은 아까와 같이 HTTP 버젼이고, 응답 코드가 있다.

 

클라이언트가 요청한 작업에 대한 서버의 응답이다. 잘 처리되었다. 접근이 거부되었다. 서버 오류이다. 등등의

내용을 담은 코드들이 각각 존재하는데, 상황에 따라 응답코드를 송신한다.

그 코드들은 아래 표에 정리를 해줌. 

 

음.. 이 중에서 우리가 자주 볼 수 있는 것들은 200, 403, 404, 500 정도가 되겠다.

코드들이 전부 100자리 숫자인데. 백의 자리 숫자로 응답코드들을 분류했다고 보면 된다.

l  1XX : 조건부 응답.

l  2XX : 성공

l  3XX : 재전송

l  4XX : 클라이언트 오류

l  5XX : 서버 오류

 

응답 코드는 더 설명할 것이 없다. 서버에서 클라이언트로 통보하는 것이므로.. 그냥 수긍하면 된다.

그 다음은 요청 메세지와 마찬가지로 헤더가 나온다.

이것 또한 응답 메세지 예제를 통해서 보겠다.

 

 

중간에 CRLF 뒤는 바디이다. 우리는 그 위에 있는 헤더부분을 보자.

Server: Microsoft-IIS/5.0 - 웹서버의 종류 및 버전이다. (Response Header)

Date: Thu, 31 Jul 2008 08:42:43 GMT - 내용이 생성된 날짜,시간 등이 기재됨. (General Header)

Content-Length: 865 - 메세지의 크기이다. (Entity Header)

Content-Type: text/html - 메세지의 타입이다. (Entity Header)

Cache-control: private - 케시를 제어하는 헤더이다. (General Header)

 

헤더들은 매번 메세지마다 다른값, 다른 항목이 나타난다. 그때 그때 찾아보면 됨. 딱히 외울것 까진..

이쯤하면 HTTP에 대한 내용을 대충 숙지한 셈이다. 

다음 포스팅엔 인코딩 기법에 대해 정리하겠음.

 

끝으로 Header들에 대해 정리를 좀 해드리리다

 

*General Header

 

*Request Header

 

 

*Response Header

 

*Entity Header

반응형

'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글

URL Encoding  (0) 2021.04.15
ASCII Encoding  (0) 2021.04.15
웹(www) 기본 개념  (0) 2021.04.15
Ruby on Rails (루비 온 레일즈) 간단정리  (0) 2021.04.15
CSS Selector  (0) 2021.04.15