*해당 모든 글은 dreamhack.io (드림핵) 자료를 바탕으로 정리한 것.
이번 코스에서는 웹 통신에 쓰이는 프로토콜인 HTTP와 HTTPS에 대해 배운다. 코스에서 배우는 핵심 개념은 다음과 같다.
• HTTP • HTTP 메시지 • HTTP 요청 • HTTP 응답 • HTTPS |
인코딩
단어는 사회적으로 정의해놓고 사용한다.
쉽게말해 우리는 사과라는 개체 이름을 "사과" 라고 정해놨기 때문에 사과를보며 "사과"라고 부르고 사용하며
바나나를 가르키고 "바나나"라고 이름지어서 사용하기로 약속 했기 때문에 바나나라는 이름이 붙은 것이다.
컴퓨터의 모든 데이터는 0과1로만 구분되는데 이를 이용해 문자를 표현하는것도 일종의 약속 덕분이다.
이런 약속들을 인코딩(Encoding) 표준 이라고 부르는데 대표적으로 인코딩 표준에는
아스키와 유니코드가 있다.
아스키는 7비트 데이터에 대한 인코딩 표준이다.
이를 이용하면 알파벳이나 특수문자 등을 표현 할 수 있다.
예를들어 "1000001" 은 "A" 로 사용하도록 아스키에서 약속되어있다.
알파벳은 아스키를 사용하고 한국어는 CP-949, UEC-KR 등을 사용했고 다른 모국어들은 또 다른것을 사용했다.
그러나 이러한 호환성은 국제 소프트웨어를 개발하는곳에서 큰 부담이 되었으며
이러한 어려움을 해결하고자 등장한 것이 유니코드 이다.
유니코드에서 유니(Uni)는 하나의 라는 단어이며 모든 언어의 문자를 하나의 표준에 담겠다는 의미이다.
유니코드에서 한 문자는 32개의 비트로 표현된다.
32비트로 표현할수 있는 정보의 가짓수는 2의 32제곱, 대략 42억 개 이다.
최근에는 일본어 중국어 한국어 영어 등등 이모지까지도 모두 유니코드로 표현하고 있다.
통신 프로토콜
웹 서버에 있는 리소스를 클라이언트에서 받아 보려면
클라이언트가 웹 서버에게 특정 리소스를 지정하여 제공해달라고 해야한다.
그럼 서버에선 이 요청을 이해하고 다음 동작을 통해 클라이언트에게 응답한다.
여기서 클라이언트의 행위를 요청(Request) 라고하고
서버의 행위를 응답 (Response) 라고한다.
요청과 응답은 우리들의 일상생활에서도 흔히 일어난다.
여기서 눈여겨봐야할 것은 우리들은 어느정도 융통성이 있다는 점이다.
예를들어 우리는 전화를 할 때 "여보세요"로 시작해 "끊어, 빠이" 등으로 끝맺음 하지만
때에 따라 인사나 서론은 제외하고 본론부터 얘기를 시작하는 때도 있다.
프로토콜은 위와 같이 규격화된 상호작용에 적용되는 약속이다.
그런데 여기서 문제는 우리들은 그렇게 해도 융통성을 발휘해 서로 이해를 하고 의사소통이 되지만
컴퓨터는 그렇지 않다는 것이다.
컴퓨터에게 융통성이라는 것은 존재하지 않으며 존재하면 오히려 버그를 일으킬 가능성이 있다.
따라서 우리는 컴퓨터와 통신할 때 엄격한 프로토콜을 사용해야한다.
그래서 많은 컴퓨터 통신 프로토콜은 명확히 해석할 수 있도록 문법(Syntax)을 포함한다.
예를들어 "GET A" 라고 보낼것을 "GIVE ME A" 라고 보내면
우리가 보았을땐 둘다 A를 나에게 달라고 이해를 할 수 있지만
컴퓨터는 엄격한 프로토콜을 사용하기 위해 문법을 포함하기때문에
"GIVE MA A"는 오류라고 처리되는것이다.
현재까지는
통신을 주고받을 때 사용되는 프로토콜인 TCP/IP
웹 어플리케이션에서 사용되는 프로토콜인 HTTP
파일을 주고받을 때 사용되는 프로토콜인 FTP 등
여러가지 프로토콜이 존재하지만 이 게시글에선 HTTP 에 대해서 다룬다.
HTTP
HTTP(Hyper Text Transfer Protocol)란
서버와 클라이언트의 데이터 교환을 요청(Request)과 응답(Response) 형식으로 정의한 프로토콜 이다.
HTTP 의 기본 매커니즘은 클라이언트가 서버에게 요청(Request) 하면 서버가 응답(Response) 한다는 것이다.
웹 서버는 클라이언트로부터 HTTP 요청을 기다리기 위해 80번 포트를 이용하여 HTTP 서버를 대기상태로 유지시킨다.
이를 통해 클라이언트가 HTTP 요청을 보낼때 해당 요청은 80번 포트를 통해 웹 서버로 전달시킨다.
이와 같이 포트를 사용하여 웹 서버가 클라이언트의 요청을 수신하고 처리할 수 있게 된다.
위에는 드림핵에 나와있는 Request 예시이다.
챗 지피티를 사용하여 한줄한줄 해석 해 보았다.
위의 내용은 HTTP 요청 메시지의 예시입니다. 각 줄을 하나씩 설명해드리겠습니다:
GET: 요청 메서드입니다. GET은 서버로부터 정보를 요청하는 메서드입니다.
/index.html: 서버에 요청하는 리소스의 경로입니다. 여기서는 "index.html" 파일을 요청하고 있습니다.
HTTP/1.1: 사용하는 HTTP 버전을 나타냅니다. 이 예시에서는 HTTP/1.1 버전을 사용하고 있습니다.
Host: dreamhack.io: 요청하는 서버의 호스트 이름을 나타냅니다. 여기서는 "dreamhack.io"라는 호스트에 요청을 보내고 있습니다.
Connection: keep-alive: 요청 후에도 TCP 연결을 유지하여 추가 요청을 보낼 수 있도록 지정합니다.
User-Agent: 웹 브라우저의 사용자 에이전트 정보를 나타냅니다. 이 예시에서는 macOS 기반의 Chrome 브라우저 정보를 포함하고 있습니다.
이렇게 구성된 요청 메시지는 클라이언트(예: 웹 브라우저)가 서버로 전송되어 해당 리소스를 요청하게 됩니다. 서버는 이 요청을 받아들이고, 해당 리소스에 대한 응답을 클라이언트에게 보내게 됩니다.
위에는 서버에서 클라이언트로 보낸 응답 (Response) 이다.
이 또한 챗 지피티를 활용하여 해석해 보았다.
위의 내용은 HTTP 응답 메시지의 예시입니다. 각 줄을 하나씩 설명해드리겠습니다:
HTTP/1.1: 사용하는 HTTP 버전을 나타냅니다. 이 예시에서는 HTTP/1.1 버전을 사용하고 있습니다.
200 OK: 응답 상태 코드입니다. "200"은 성공을 나타내는 코드이며, "OK"는 요청이 성공적으로 처리되었음을 의미합니다.
Server: Apache/2.4.29 (Ubuntu): 서버가 사용하는 소프트웨어와 버전 정보입니다. 이 예시에서는 Ubuntu 운영체제에서 동작하는 Apache 웹 서버의 버전이 "2.4.29"임을 나타냅니다.
Content-Length: 61: 응답 본문의 크기를 바이트 단위로 나타냅니다. 이 예시에서는 본문의 크기가 61바이트임을 나타냅니다.
Connection: Keep-Alive: 클라이언트와 서버 간의 TCP 연결을 유지하여 추가 요청에 대비하는 것을 나타냅니다.
Content-Type: text/html: 응답 본문의 콘텐츠 유형을 나타냅니다. 이 예시에서는 "text/html"로 HTML 형식의 문서임을 나타냅니다.
<!doctype html>: HTML 문서의 시작을 나타내는 태그입니다.
<html>, <head>, <body>: HTML 문서의 구조를 정의하는 태그입니다. <html>은 문서의 루트 요소를 나타내고, <head>는 문서의 헤더 정보를 포함하며, <body>는 문서의 본문을 포함합니다.
이렇게 구성된 응답 메시지는 서버가 클라이언트의 요청을 처리한 후, 응답으로 해당 HTML 문서를 클라이언트에게 전송합니다. 클라이언트는 이를 받아들여 웹 페이지를 표시하게 됩니다.
HTTP 메시지
HTTP 메시지에는 클라이언트가 전송하는 요청 (Request) , 서버가 반환하는 응답 (Response) 가 있다.
기능과 세부 구조에서는 차이가 있지만 크게 보면 이들은 헤더와 바디로 이루어져 있다.
헤더와 바디를 이해하기 쉽게 챗지피티를 이용해 설명받았다.
HTTP 헤더
HTTP 헤더는 요청이나 응답에 대한 추가 정보를 담는 부분입니다. 이 정보는 클라이언트와 서버 간의 통신을 도와주는 역할을 합니다.
예를 들어, 웹 브라우저에서 웹 페이지를 요청할 때, HTTP 헤더에는 다음과 같은 정보가 들어갈 수 있습니다:
어떤 종류의 데이터를 요청하고 있는지 (예: HTML 페이지, 이미지, CSS 파일 등)
어떤 언어로 응답을 받고 싶은지
어떤 브라우저를 사용하는지
캐싱을 사용하여 저장된 정보를 사용하고 싶은지 등
서버는 이러한 헤더 정보를 확인하여 요청에 대한 적절한 응답을 줄 수 있습니다. 마찬가지로, 서버가 클라이언트에게 응답할 때도 헤더를 사용하여 다양한 정보를 전달할 수 있습니다. 예를 들어, 응답의 상태 코드 (예: 200 OK)나 콘텐츠의 유형 (예: 텍스트, 이미지, 동영상) 등을 헤더를 통해 전송할 수 있습니다.
헤더는 키(Key)와 값(Value)의 쌍으로 구성되어 있습니다. 각 키와 값은 콜론(:)으로 구분되며, 여러 개의 헤더 필드가 존재할 수 있습니다. 이러한 헤더 정보는 HTTP 프로토콜을 통해 클라이언트와 서버 간에 교환되어 통신을 원활하게 합니다.
간단히 말하면, HTTP 헤더는 요청과 응답에 대한 부가적인 정보를 담고 있어서, 클라이언트와 서버가 서로 이해하고 효율적으로 통신할 수 있도록 도와주는 역할을 합니다.
HTTP 바디
HTTP 바디는 HTTP 요청이나 응답에 포함되는 실제 데이터를 말합니다. 즉, 실제로 전송되는 콘텐츠가 담겨있는 부분입니다.
클라이언트가 서버에 요청을 보낼 때, 요청 메시지의 바디에는 웹 페이지 양식 데이터, 파일 업로드, JSON 데이터 등과 같이 서버로 전송하고자 하는 데이터가 들어갑니다. 이 데이터는 서버에서 처리하거나 저장되는 용도로 사용됩니다.
서버는 클라이언트로부터 받은 요청의 바디를 읽어서 그에 맞는 처리를 수행한 후, 응답을 생성할 때 바디에 데이터를 담아서 전송합니다. 예를 들어, HTML 문서, 이미지 파일, 동영상, API 응답 데이터 등이 HTTP 바디에 포함될 수 있습니다.
HTTP 바디는 헤더 필드(Content-Type)에 의해 어떤 형식의 데이터가 담겨있는지를 나타냅니다. 예를 들어, 텍스트 형식의 데이터인 경우 'text/html', 'text/plain'과 같은 Content-Type을 사용하여 정의하고, 이미지인 경우 'image/jpeg', 'image/png'과 같은 Content-Type을 사용하여 정의합니다.
요약하자면, HTTP 바디는 요청이나 응답에 포함되는 실제 데이터를 담고 있으며, 클라이언트와 서버 간에 데이터를 교환하고 처리하는 데 사용됩니다. 이 데이터는 Content-Type 헤더에 따라 다양한 형식으로 구성될 수 있습니다.
HTTPS
HTTP의 요청과 응답은 평문으로 사용된다.
그러나 이를 가로채거나 하면 정보가 노출될 수 있다.
예를들면 아이디와 비번을 입력해 POST를 사용해 보냈지만 이를 중간에서 공격자가 탈취한다면
아이디와 비번을 그대로 노출당하는 것이다.
HTTPS(HTTP over Secure socket layer) 는 TLS(Transport Layer Security) 프로토콜을 사용하여
서버와 클라이언트에 오가는 HTTP 메시지를 모두 암호화 한다.
따라서 중간에서 가로채도 아이디와 비밀번호가 암호화 되어있어 노출되지않으며 이를 해독하는것은 불가능하다.
기본적인 HTTP 메시지
TLS로 암호화된 HTTP 메시지
'드림핵 정리' 카테고리의 다른 글
드림 핵 - 웹 해킹 - cookie session ( Background: Cookie & Session ) (2) | 2023.07.01 |
---|---|
드림 핵 - 웹 해킹 - 웹 브라우저 ( Tools : Browser DevTools ) (0) | 2023.06.27 |
드림 핵 - 웹 해킹 - 웹 브라우저 ( Background : Web Browser ) (0) | 2023.06.27 |
드림 핵 - 웹 해킹 - 웹 기본 상식 ( Background: Web ) (0) | 2023.06.25 |
드림 핵 - 웹 해킹 - 소개 (0) | 2023.06.25 |