본문 바로가기
네트워크

HTTP 기본

by 매트(Mat) 2020. 10. 21.

웹(Web)

클라이언트 - 서버 구조로 통신
이 말은 많이 들어봤을 것입니다.

클라이언트에서 서버에게 요청을 하게 되면 서버는 그 요청에 대한 응답을 해주어 다시 클라이언트에게 요청한 결과를 돌려줍니다.

이렇게 클라이언트에서 서버까지 일련의 흐름을 결정하고 있는 것이 웹에서 HTTP(HyperText Transfer Protocol)이라 불리는 프로토콜입니다.

웹의 탄생 배경

웹이 탄생하게 된 궁극적인 목표는 정보 공유입니다.
아주 멀리 있는 사람끼리 서로 소통하고 더 많은 정보를 공유하기 위함입니다.

문서 언어로는 HTML(HyperText Markup Language), 문서 전송 프로토콜은 HTTP, 문서의 주소가 필요한데 이는 URL(Uniform Resource Locator) 가 메인이었습니다.

모든 것을 링크로 연결하여 사람들과 소통하고 또 그 사람들은 또다른 사람들과 연결되어 그물망처럼 퍼져나가는 것이죠.

IP(Internet Protocol)

TCP/IP는 어플리케이션 계층 - 트랜스포트 계층 - 네트워크 계층 - 링크 계층 4계층으로 이루어져 있습니다.
IP는 네트워크 계층에 해당됩니다. 이 IP를 주소라고 말하는 분도 있지만 사실은 TCP/IP 프로토콜의 일부분인 하나의 프로토콜입니다.

IP 주소: 각 노드에 부여된 주소, 변경 가능
MAC 주소: 각 네트워크 카드에 할당된 고유의 주소, 변경 불가

IP 통신은 MAC 주소에 의존해서 통신을 합니다. MAC 주소를 이용하여 목적지를 찾아가는데 이때, ARP(Address Resolution Protocol)이라는 프로토콜이 사용됩니다.
ARP는 주소를 해결하기 위한 프로토콜 중 하나인데, 수신지의 IP 주소를 바탕으로 MAC 주소를 조사할 수 있습니다.

TCP(Transfer Control Protocol)

TCP는 트랜스포트 계층에 해당되는데, 신뢰성 있는 바이트 스트림 서비스를 제공합니다.
TCP는 대용량의 데이터를 보내기 쉽게 작게 분해하여 상대에게 보내고, 정확하게 도착했는지 확인하는 역할을 담당하고 있습니다.

DNS(Domain Name System)

HTTP와 같이 응용 계층 시스템에서 도메인 이름과 IP 주소 이름 확인을 제공합니다.
DNS는 도메인명에서 IP주소를 조사하거나 반대로 IP주소로부터 도메인명을 조사하는 서비스를 제공합니다.

쉽게 말해 컴퓨터는 영어를 못알아먹으니까 이를 숫자형태로 번역해주는 것이 바로 DNS입니다.

KakaoTalk_20201020_220752630

URI & URL

웹 브라우저 등으로 웹 페이지를 표시하기 위해 입력하는 주소가 바로 URL

ex) https://www.google.co.kr

URI(Uniform Resource Identifiers)는 스키마를 나타내는 리소스를 식별하기위해 문자열 전반을 나타내지만 URL은 리소스의 장소(네트워크 위치)를 나타냅니다.

ex) 스키마: http, https, ftp, telnet

리퀘스트 & 리스폰스

아래는 클라이언트 측으로부터 HTTP 서버에 송신되었던 리퀘스트 내용입니다.

GET /index.html HTTP /1.1
Host: www.jaclr.jp

GET은 서버에 요구하는 메소드입니다. /index.html은 요구 대상인 리퀘스트 URI입니다.
HTTP /1.1은 HTTP 버전을 뜻합니다.

여기서 알 수 있는 것은 리퀘스트 메시지는 메소드, URI, 프로토콜 버전 그리고 옵션인 리퀘스트 헤더 필드와 엔티티로 구성되어 있습니다.

HTTP /1.1 200 OK
Date ....
Content-Length:..
Content-type: text/html
...

위에는 리퀘스트 내용입니다.
보시면 HTTP버전과 200 OK라는 문구가 보입니다. 이는 리퀘스트 처리 결과에 대한 상태 코드입니다. 에러가 발생한다면 에러 코드를 보냅니다.
그 다음 줄은 리스폰스 헤더 필드입니다.

KakaoTalk_20201020_225327909

stateless

HTTP는 상태를 계속 유지하지 않는 stateless 프로토콜입니다. 즉 HTTP 프로토콜 레벨에서는 이전에 보냈던 리퀘스트나 이미 되돌려준 리스폰스에 대해서는 전혀 기억하지 않습니다.

이는 많은 데이터를 매우 빠르고 확실하게 처리한다는 장점이 있지만, 단점도 존재합니다.

우리가 쇼핑몰에 로그인을 하고 다른 페이지에 이동할 때에도 그 로그인은 유지되어야 합니다.
하지만 HTTP/1.1은 상태를 유지하지 않는 프로토콜입니다. 매번 다른 페이지에 들어갈 때마다 로그인을 해야하는 불편함...
이를 방지하기 위해 쿠키(Cookie)라는 기술이 도입됩니다.
이 쿠키로 인해 HTTP 통신에서도 상태를 계속 유지, 관리할 수 있게 됩니다.

HTTP의 취약점 & HTTPS

  • 암호화 되지 않은 상태에서 통신하기 때문에 도청 가능
  • 통신 상대를 확인하지 않기 때문에 위장 가능
  • 완전성을 증명할 수 없기 때문에 변고 가능

이렇게 HTTP는 보안에 취약합니다.
Wireshark 라는 프로그램을 이용하면 패킷에 대한 정보를 자세하게 볼 수 있고 HTTP 메시지 내용 전부를 볼 수 있습니다. 데이터 내용은 16진수로 확인가능하기 때문에 쉽게 조작할 수 있겠죠.


통신 암호화하는 방법중 SSL(Secure Socket Layer)이나 TSL(Transport Layer Security)이라는 다른 프로토콜과 조합합니다.
SSL 등을 이용해 안전한 통신로를 확립해 그 다음에 HTTP로 통신하는 것이죠.
이렇게 SSL을 조합한 HTTP를 바로 HTTPS(HTTP Secure) 또는 HTTP over SSL 이라 불립니다.
SSL은 암호화뿐만 아니라 상대를 확인하는 수단으로 증명서를 제공하고 있습니다.
이 증명서는 제3자 기관에서 발행되는 것이기에 서버나 클라이언트가 실재하는 사실을 증명합니다.

HTTP의 URI : http://
HTTPS의 URI : https://

KakaoTalk_20201021_142519381

이 방법과 또 한 가지는 통신하고 있는 메시지 내용 자체를 암호화시켜버리는 것입니다.
HTTP의 내용에는 전부 중요한 것들을 담고 있는데 이를 암호화 시켜버리는 것이죠.
이 경우, 클라이언트에서 HTTP 메시지를 암호화해서 출력하는 처리라 필요하게 됩니다.


암호화나 복호화 할 때는 키(key)라는 것이 필요합니다. 만약 이 키를 가지고 공격자가 조작할 수 있다면 이 역시 HTTPS도 무용지물이 될 것입니다.
만약 이 키가 없으면 암호화된 것을 복호화할 수 없습니다.
그래서 이 키를 안전하게 보낼 수 있어야 하는데요. 그 방법이 공개키 암호 방식입니다.

공개키 암호에는 서로 다른 두 개의 키 페어를 사용합니다.
하나는 비밀키(Secret Key)공개키(Public Key)가 있습니다.

  • 공개키 암호를 사용한 암호화는 암호를 보내는 측이 상대의 공개키를 사용해 암호화를 합니다.
  • 암호화를 받아들인 상대는 자신의 비밀키를 사용해 복호화를 실시합니다.

이 방식이 좋은 이유는 암호를 푸는 이 비밀키를 통신으로 보낼 필요가 없기 때문에 도청에 의해 키를 뺏길 걱정이 없기 때문입니다.

아래 그림을 통해 쉽게 이해할 수 있습니다.

KakaoTalk_20201021_144259899

그렇다면 왜 이 좋은 HTTPS 프로토콜을 모든 사이트에서 사용하지 않은 것일까요??
그 이유는 SSL을 사용하게 되면 CPU나 메모리 등 리소스가 많이 필요하기 때문에 처리 속도가 길어집니다. 부하도 상당합니다.
또 하나의 이유는 비용이 듭니다.

웹 어플리케이션

웹 어플리케이션은 웹 기능을 사용해서 제공되는 프로그램을 말합니다. 쇼핑 사이트, 인터넷 뱅킹, SNS나 게시판, 검색 엔진, e-러닝 등 인터넷이나 인트라넷 상에는 다양한 웹 어플리케이션이 존재합니다.

CGI

CGI(Common Gateway Interface)는 웹서버가 클라이언트에서 받은 리퀘스트를 프로그램에 전달하기 위한 구조입니다. CGI에 의해 프로그램은 리퀘스트 내용에 맞게 HTML을 생성하는 등으로 동적으로 콘텐츠를 생성할 수 있습니다.
CGI를 사용한 프로그램을 CGI 프로그램이라고 하는데 Perl, PHP, Ruby, C 등의 프로그래밍 언어가 사용되고 있습니다.

서블릿(Servlet)

CGI는 리퀘스트마다 프로그램을 가동하기 때문에 대량으로 액세스가 있을 때 웹 서버에 부하가 걸리게 되지만 서블릿은 웹서버와 같은 프로세스 속에서 동작하기 때문에 비교적 부하를 적게 하여 동작시킬 수 있습니다.
서블릿의 실행환경을 컨테이너 혹은 서블릿 컨테이너라고 부릅니다.

서블릿은 CGI의 문제점을 해결하는 기술로서 Java와 함께 보급되었습니다.

XML

XML(eXtensible Marup Language)은 목적에 맞게 확장 가능한 범용적으로 사용할 수 있는 마크업 언어입니다. XML을 사용함으로써 인터넷을 통해 데이터 공유를 용이하게 하는 것을 목적으로 하고 있습니다.
XML은 데이터를 재사용하기 쉽다는 점에서 데이터 교환 포맷으로서 서로 다른 어플리케이션 사이에서 이용되기도 합니다.

공격(Attack)

웹 어플리케이션에 대한 공격 패턴은 두 가지가 있습니다

  • 능동적 공격
  • 수동적 공격

능동적 공격(active attack)은 공격자가 직접 웹 어플리케이션에 액세스해서 공격 코드를 보내는 타입입니다.

SQL 인젝션, OS 커맨드 인젝션

수동적 공격(passive attack)은 함정을 이용해서 유저에게 공격 코드를 실행시키는 공겨입니다.

크로스 사이트 스크립팅(XSS, cross-site scripting), 크로스 사이트 리퀘스트 포저리(CSRF, Cross Site Request Forgery)
흔히 군대에서 인트라넷을 사용하는데 보안 교육중에서 "이상한 메일을 열람하지 마세요." 라는 교육을 받은 적이 있을 것입니다. 만약 열었을 경우 공격자가 침입할 수 있게 되는 것이죠.

크로스 사이트 스크립팅

XSS는 취약성이 있는 웹 사이트를 방문한 사용자의 브라우저에서 부정한 HTML 태그나 Javascript 등을 동작시키는 공격입니다. 동적으로 HTML을 생성하는 부분에서 취약성이 발생할 수 있습니다. 이는 공격자가 작성한 스크립트가 함정이 되고 유저의 브라우저 상에서 움직이는 수동적 공격입니다.

  • 가짜 입력 폼 등에 의해 유저의 개인 정보 갈취
  • 스크립트에 의해 유저의 쿠키 값이 도둑맞거나 피해자가 의도하지 않은 리퀘스트가 송신
  • 가짜 문장이나 이미지 등이 표시된다

참고 책

그림으로 배우는 HTTP & NetWork Basic의 저자 우에노 센 그리고 이병억님이 번역한 책을 통해 정리하였습니다.

HTTP의 기본을 알고 싶다면 .

'네트워크' 카테고리의 다른 글

네트워크 기초  (0) 2020.07.23

댓글