본문 바로가기

도서

그림으로 배우는 Http & Network Basic

📚 후기



 

오며 가며 스타텁 회사들의 블로그를 보다가 모 회사에서 이 책을 주제로 스터디를 진행한 것을 보고, 나도 뽐뿌가 와서 한 번 사보았다. 정가는 15,000원인데 yes24에서 한 달에 한 번씩 천 원씩(앱으로 로그인하면 천 원 더 줌) 주는 쿠폰이랑 이것저것 엮어서 9천 원대에 샀다. 야호!

 

 

워낙 주제가 주제이다보니 제목 그대로 '그림'으로 배우는 내용이라 이해가 더 잘됐다. 클라이언트와 서버 사이에서 주고받는 개념을 설명하려면 아무래도 그림이 있는 게 이해하는 측면에서는 더 직관적인 것 같다. 책의 내용은 더도 말고 덜도 말고 전반적인 개념을 한번 훑기에 딱 좋았다. 또, 앞의 내용이 뒤에 가서 더 자세히 설명되거나 반복되는 점도 있어서 입문자는 생소한 개념을 이해하는 입장에서 도움이 될 것 같다.

 

개발자 도구 network에서 오류 찾을 때 request나 reponse를 지겹게 봐왔지만 헤더를 하나하나 뜯어서 모든 내용을 자세히 보지는 않았기 때문에, 그때 무심코 지나쳤던 내용들도 아~ 이런 내용이었구나 하고 돌이켜보기도 하고, 정보처리기사 취득 이후로 희미해져 가던 기억들을 다시 살려보기도 했다. 막연히 HTTPS는 HTTP보다 보안적으로 좋은 거!라고 생각하고 있었다면, 책을 읽고 나서는 어떤 점이 HTTP에서는 취약하고, HTTPS를 통해서 이러한 점들을 어떻게 보완할 수 있는지 알 수 있었다.

 

📝 정리



 

웹과 네트워크의 기본


  • HTTP(HyperText Transfer Protocol)은 클라이언트에서 서버까지 일련의 흐름을 결정하는 프로토콜
  • TCP와 IP 프로토콜을 가리켜 TCP/IP라고 부르기도 하지만, IP 프로토콜을 사용한 통신에서 사용되고 있는 프로토콜을 총칭해서 TCP/IP라는 이름이 사용되고 있다.
  • TCP/IP는 애플리케이션 계층, 트랜스포트 계층, 네트워크 계층, 링크 계층 이렇게 4 계층으로 나뉘어 있다.
  • 애플리케이션 계층은 유저에게 제공되는 애플리케이션에서 사용하는 통신의 움직임을 결정한다. ex)HTTP, FTP, DNS
  • 트랜스포트 계층은 애플리케이션 계층에 네트워크로 접속되어 있는 2대의 컴퓨터 사이의 데이터 흐름을 제공한다. ex) TCP, UDP
  • 네트워크 계층은 네크워크 상에서 패킷의 이동을 다룬다. 패킷이란 전송하는 데이터의 최소 단위이다.
  • 링크 계층은 네트워크에 접속하는 하드웨어 적인 면을 다룬다.
  • IP주소는 각 노드에 부여된 주소를 가리키고 MAC 주소는 각 네트워크 카드에 할당된 고유의 주소이다.
  • 3 Way-Handshake란 상대에게 패킷을 보내고 바로 끝내는 것이 아니라, 보내졌는지 여부를 상대에게 확인한다. 'SYN', 'ACK'라는 TCP플래그를 사용한다.
  • DNS(Domain Name System)은 HTTP와 같이 응용 계층 시스템에서 도메인 이름과 IP 주소 이름 확인을 제공한다.
  • URI는 리소스를 식별하기 위해 문자열 전반을 나타내는데 비해 URL은 리소스의 장소(네트워크 상의 위치)를 나타낸다.
  • HTTP는 상태를 계속 유지하지 않는 stateless 포로토콜이다. 따라서 이전에 보냈던 리퀘스트나 이미 되돌려준 리스폰스에 대해서는 전혀 기억하지 않는다.
  • 쿠키는 서버에서 Response로 보내진 Set-Cookie라는 헤더 필드에 의해 쿠키를 클라이언트에 보존하게 된다. 다음번에 Request를 보낼 때 자동으로 쿠키 값을 넣어서 송신하게 된다.

 

HTTP 메시지


  • HTTP에서 교환하는 정보는 HTTP 메시지라고 불린다. 복수 행(개행 문자는 CR+LF)의 데이트로 구성된 텍스트 문자열이다.
  • HTTP 메시지는 크게 구분하면 메시지 헤더와 메시지 바디로 구분되어 있고, 최초에 나타나는 개행 문자로 메시지 헤더와 메시지 바디를 구분한다.
  • HTTP로 데이터를 전송할 경우 그대로 전송할 수도 있지만 전송할 때에 인코딩(변환)을 실시함으로써 전송 효율을 높일 수 있다.
  • 메시지 바디와 엔티티 바디의 차이
    • 메시지(Message): HTTP 통신의 기본 단위로 옥텟 시퀀스(Octet Sequence, octet은 8비트)로 구성되고 통신을 통해서 전송된다.
    • 엔티티(Entity): Request와 Response의 페이로드(Payload, 부가물)로 전송되는 정보로 엔티티 헤더 필드와 엔티티 바디로 구성된다.
    • HTTP 메시지 바디의 역할은 리퀘스트와 라스폰스에 관한 엔티티 바디를 운반하는 일이다. 기본적으로 메시지 바디와 엔티티 바디는 같지만 전송 코딩이 적용된 경우에는 엔티티 바디의 내용이 변화하기 때문에 메시지 바디와 달라진다.
  • Content Negotiation이란 클라이언트와 서버가 제공하는 리소스의 내용에 대해서 교섭하는 것이다. 제공하는 리소스를 언어와 문자 세트, 인코딩 방식을 기준으로 판단한다.

 

HTTP와 연계하는 웹서버


  • 프록시 : 서버와 클라이언트의 양쪽 역할을 하는 중계 프로그램이다. 프록시 서버를 경유해서 리퀘스트와 리스폰스를 릴레이 할 때마다 "via" 헤더 필드에 정보를 추가한다.

    • 캐시(Cache)는 프록시 서버와 클라이언트의 로컬 디스크에 보관된 리소스의 사본을 가리킨다.
    • 캐싱 프록시: 프록시 서버상에 리소스 캐시를 보존해 주는 타입의 프록시이다. 프록시에 같은 리소스 리퀘스트가 온 경우, 오리진 서버로부터 리소스를 획득하는 것이 아니라 캐시를 리스폰스로서 되돌려 주는 것이다.
    • 투명 프록시: 프록시로 리퀘스트와 리스폰스를 중계할 때 메세지를 변경하지 않는 타입이다
  • 게이트웨이: HTTP 서버 이외의 서버를 중계하는 서버로, 클라이언트로부터 수신한 리퀘스트를 리소스를 보유한 서버인 것 처럼 수신한다.

  • 터널: 서로 떨어진 두 대의 클라이언트와 서버 사이를 중계하며 접속을 주선하는 중계 프로그램

 

헤더 필드


  • 쿠키 Set-Cookie 필드 속성
    • Secure: 웹페이지가 HTTPS에서 열렸을 때만 쿠키 송출을 제한하기 위해 지정함
    • HttpOnly: 자바스크립트르 경유해서 쿠키를 취득하지 못하도록 하는 쿠키의 확장 기능이다. 크로스 사이트 스크립팅(XSS)으로부터 쿠키 도청을 막는 것을 목적으로 하고 있다. 따라서 자바스크립트 document.cookie로는 읽어 들일 수 없다.

 

웹을 안전하게 지켜주는 HTTPS


  • HTTP는 아래와 같은 보안 취약점이 있다.

    1. 암호화 하는 기능은 없기 때문에 통신 전체가 암호화되지는 않는다. 즉 평문으로 HTTP메세지를 보내게 된다.
    2. TCP/IP 구조의 통신 내용은 전부 통신 경로의 도중에 엿볼 수 있다.
    3. 통신 상대를 확인하지 않기 때문에 클라이언트/서버 위장이 가능하다.
    4. 완전성을 증명할 수 없기 때문에 내용 변조가 가능하다.
  • 위의 취약점에 대한 해결 책으로 HTTPS 가 있다.

    1. HTTP + 암호화 + 인증 + 완전성 보호 = HTTPS
    2. HTTPS는 HTTP통신의 소켓 부분을 SSL(Secure Socket Layer)이나 TLS(Transport Layer Security)라는 프로토콜로 대체한다. 만약 SSL과 함께 사용한다면, HTTP는 SSL과 통신하고 SSL이 TCP와 통신하게 된다.
    3. 또, 애플리케이션 계층의 데이터를 송신할 때에는 MAC(Message Authentication Code)라고 부르는 메시지 다이제스트를 덧붙일 수도 있다. MAC을 이용해서 변조를 감지할 수 있어 완전성 보호를 실현할 수 있다.
    4. 하지만 평문 통신에 비해서 CPU나 메모리 등 리소스가 많이 필요하기 때문에 개인 정보등 민감한 정보를 다룰 때만 HTTPS에 의한 암호화 통신을 사용한다. 또한 증명서 구입을 위한 비용이 든다는 단점이 있다.

 

웹 공격 기술


  • 크로스 사이트 스크립팅(XSS, Cross-Site Scripting): 취약성이 있는 웹 사이트를 방문한 사용자의 브라우저에서 부정한 HTML 태그나 JavaScript 등을 동작시키는 공격
  • SQL 인젝션(SQL Injection): 웹 애플리케이션을 이용하고 있는 데이터베이스에 SQL을 부정하게 실행하는 공격
  • OS 커맨드 인젝션(OS Command Injection): 웹 애플리케이션을 경유하여 OS명령을 부정하게 실행하는 공격이다. 쉘을 호출하는 함수가 있는 곳에서 발생할 가능성이 있다.
  • HTTP 헤더 인젝션(HTTP Header Injection): 공격자가 리스폰스 헤더 필드에 개행 문자 등을 삽입함으로써 임의의 리스폰스 헤더 필드나 바디를 추가하는 수동적 공격
  • 디렉토리디렉터리 접근 공격(Directory Traversal/Path Traversal): 비공개 디렉터리의 파일에 대해서 부정하게 디렉터리 패스를 가로질러 액세스 하는 공격
  • 리모트 파일 인클루션(Remote File Inclusion): 스크립트의 일부를 다른 파일에서 읽어올 때 공격자가 지정한 외부 서버의 URL을 파일에서 읽게 함으로써 임의의 스크립트를 동작시키는 공격
  • 크로스 사이트 리퀘스트 포저리(CSRF, Cross-Site Request Forgeries): 인증된 유저가 의도하지 않은 개인 정보나 설정 정보 등을 공격자가 설치해 둔 함정에 의해 어떤 상태를 갱신하는 처리를 강제로 실행시키는 공격으로 수동적 공격이다.