이동준1
아웃풋 공부
이동준1
전체 방문자
오늘
어제
  • 분류 전체보기 (84)
    • airflow (8)
    • sql (23)
    • aws (12)
    • python (3)
    • 네트워크 (12)
    • 알고리즘 (2)
    • 짧은서평 (24)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • AWS
  • 서평
  • 고통의비밀
  • 퓨처셀프
  • regexp
  • 유연함의힘
  • 고통의 비밀
  • 네트워크
  • Network

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
이동준1
네트워크

[네트워크] HTTP 개요

[네트워크] HTTP 개요
네트워크

[네트워크] HTTP 개요

2023. 1. 10. 11:06

FTP / HTTP 복기

FTP는 당시에는 편리한 프로토콜이었다. 사람에 따라 권한을 부여한 뒤에, 파일을 주고받는 목적을 충분히 달성했기 때문이다. FTP는 이 목적을 달성하기 위해 서버가 많은 정보를 관리하는 형태이다. 서버가 많은 권한을 가지게되면 확장성이 떨어진다는 큰 단점이 존재한다. 만약, 내가 원하는 기능이 Session Layer(FTP)에서 지원하지 않는다면 답답한 상황이 벌어질 것이다. 현대에는 시스템이 자주 변하는데, FTP 에서는 시스템이 변할때마다 프로토콜을 수정해야한다. 이는 매우 번거롭다.

 

반면, HTTP는 Session Layer가 굉장히 얇으며 단순한 프로토콜이다. HTTP는 많은 권한을 응용계층 계층에 위임하게 된다. 응용계층은 웹사이트를 만든 사람이 관리하기때문에 확장이 쉽다.

 


HTTP 개요

HTTP는 기본적으로 WWW(World Wid Web)을 위한 세션 계층을 위한 프로토콜이다. 목적은 전세계 인터넷에 있는 정보를 탐색하게 하는 것이다. 그리고 HTML을 기본 Presentation Layer로 사용한다.

 

가장 기본적인 동작은 웹 자료를 가져와서 보여주는 GET과, 웹의 자료를 포스팅하는 POST이다. 즉, 내가 원하는 자료를 웹에서 받고 보내는것이 HTML의 기본 동작이다. 이 동작을 이해하기위해 URL부터 알아야할 필요가 있다.

 

URL (Universal Resource Location)

우리는 상대의 기계에 접속하는 것 같지만 기계가 아니라, 기계에 있는 process에 접속한다는 것을 기억해야한다. 우리는 상대의 주소 (IP와 포트번호)를 알아야지만이 원하는 process에 접근할 수 있다. 그러나 이 주소는 숫자로 이루어져있고, 무작위적이다. 때문에 사람이 기억하기에 좋은 형태가 아니다. 그래서 이 주소를 사람이 기억하기에 좀더 좋은 형태로 만든것이 URL이다. URL은 단어에서도 나와있듯이, 단 하나밖에 없는(Universal) 위치 정보이다.

 

 

아래와 같은 URL을 하나 살펴보자. 아래 URL은 3가지 부분으로 나눌 수 있다.

http://formal.knu.ac.kr/comnet/ 

1) Protocol 이름

http: 는 프로토콜의 이름을 의미한다. 즉, 이때 내가 사용하고자 하는 Session Layer는 http이다. 만약 'file:'이라고 사용한다면, 개인 컴퓨터에 있는 파일을 보는것이 가능하다 (이때는 universal한 경우는 아니다). 그리고 'ftp:' 라고 사용하는것도 가능하다.

 

2) Host의 이름

//formal.knu.ac.kr은 사용자가 접속하는 호스트의 이름을 나타낸다. '//'는 url의 시작을 나타낸다. 호스트 이름을 사용한다는것은 IP주소를 사용하는것과 동일하다. 원래는 Process에 가고자할때 IP + 포트번호를 이용한다. 하지만 이것은 사람이 기억하기 어려운 형태이기 때문에, IP대신 사람이 기억하기 쉬운 호스트 이름을 사용하는 것이다. 호스트의 이름은 작은 개념부터 큰 개념으로 확장해나간다.

 

3) 실제 자원의 위치

/comnet/은 실제 자원의 위치를 나타낸다. 기기안에는 여러가지 자원이 있으므로, 그 자원들중에 원하는 자원을 지명하는 것이 필요하다. 만약 자원의 위치가 위처럼 슬래시(/)로 끝나게되면 디렉토리를 의미하는것이다 (http://formal.knu.ac.kr/comnet/index.html 처럼 파일 명이 등장할수도 있다). 그리고 이렇게 디렉토리를 지정하게되면, 이 디렉토리의 대표적인 웹페이지를 보여줄 수 있도록 하는것이 일반적이다.

 

http://formal.knu.ac.kr:8080/ 도하나의 의 URL이라 할수 있는데, 이는 host_name[: 포트번호] 의 형식로 표현된 것이다. 이때, 포트번호는 생략될 수 있는데, 맨 좌측에 http를 입력하게 되면 기본적으로 사용하는 포트번호(80)가 존재하기 때문이다. 그래서 http를 쓴 뒤에 포트번호를 입력하지 않는다면 자동으로 80번 포트로 접속하게 된다. 위와같은 경우는 8080포트를 사용했는데, 이미 서버에 홈페이지가 존재하면 80번포트를 열수없기 때문에, 새로 테스트 홈페이지를 생성하고 싶은 경우 8080포트를 사용한다.

 


HTTP Transaction

요청부터 응답까지의 과정을 HTTP Transaction 이라고 일컫는다. Transaction은 하나의 요청과 하나의 응답으로 이루어져있다. GET/POST를 하기 이전에 웹서버에 TCP 연결을 요청해야하는데, 경우에 따라서는 TCP연결이 이미 이루어져있는 경우도 있다. TCP연결을 종료하지 않고 다시 GET/POST를 할 수 있기 때문이다. 따라서 Transaction에서 TCP 연결과 종료는 상황에따라 선택적 행위가 된다. 예를들어, TCP가 연결되어 있다면 요청-응답의 과정이 하나의 HTTP Transaction이다.

 

 

Stateless Protocol

HTTP Transaction은 Stateless Protocol이다. 즉, 한번 요청하고 응답하는 과정이 끝나면 어떤 일을 하고있었는지 잊어버리게 된다. 요청하고 응답하는 과정이 끝나면 서버는 자신의 역할을 다한 것이다. HTTP에서는 정보를 서버가 가지고 있어야할 필요가 없기 때문이다.

 

이렇게 서버가 정보를 기억하지 않아도 되는 형태로 단순하기 만들었기 때문에, 그 위에 풍부한 응용들을 더해나가는 것이 가능하다. 반면 FTP처럼 Session Layer가 많은 부분을 담당하게 된다면, 여러 방면에서 Session Layer에 구속되는 상황이 벌어진다. 즉, 자유도가 줄어든다. 따라서, 프로토콜을 설계할때 너무 많은 제약 조건을 생성하는것은 지양할 필요가 있다.

 


GET과 POST

웹서버와 통신할때는 크게 GET과 POST를 이용한다. 두 방법 모두 동일하게 헤더와 띄어쓰기, 그리고 몸통으로 이루어져있다. 헤더는 두 방법 모두 필수적인 요소이지만, 몸통은 GET에게는 선택사항이며 POST에게는 필수사항이다.

 

GET

GET은 원하는 자원을 가져오기위한 목적으로 이용된다.

형식: GET→서버상 자원의 위치→HTTP/1.1 ('→'는 띄어쓰기를 나타낸다)

 

GET /comnet/ HTTP/1.1 를 하나의 예시로 들수 있다. HTTP뒤에오는 수치는 HTTP의 버젼을 나타낸다. 버젼을 표기하는 이유는 상대에게 내가 어떤 의사소통 방식을 가지고있는지 알려야 그에맞는 소통이 가능하기 때문이다. 이렇게 위와같은 형식을 사용하면 기본적인 요청의 형태가 갖추어진다.

 

기본적인 요청의 형태는 끝이나지만, 여기서 추가적으로 내가 원하는 자원의 특성이나 나의 특성을 상대방에게 알려준다면 좀더 효과적인 대화를 나누는 것이 가능하다. 예를들어, 서버가 데이터를 압축해서 클라이언트에게 보내려고한다. 그러나, 압축을 해서 전달했을때 클라이언트가 이해할지 확신할수 없는 상황이 존재할 수 있다. 만약 서버가 데이터를 압축해서 전달하려하는데 클라이언트가 압축된 결과를 이해하지 못하는 상황이라면, 서버에게 최대한 압축없이 데이터를 달라고 요청할 수 있다. 이런 방식으로 데이터를 요청(GET)할때, 세심하게 특성에대한 정보를 준다면 서버가 나에게 적절한 정보를 줄 확률이 높아진다.

 

'GET '서버상 자원의 위치' HTTP/1.1' 의 형식에는 호스트의 이름이 기입되어있지 않은데, 이 기본요청뒤에 호스트의 이름과 브라우저의 형태도 같이 전달한다.

 

예를들어,

GET /comnet/ HTTP/1.1

Host: formal.knu.ac.kr

User_Agent: Mozilla/50

 

라고 전달할 수 있다. 이 host와 User-agent까지 기입한 부분을 HTTP 요청 헤더라고한다. 이렇게 헤더를 작성하고 한줄을 띄우면 헤더가 끝났다는 의미이고, 요청이 끝나게된다. 그 후에는 서버가 요청을 받아들여 응답을 준다.

 

만약, 요청하는 데이터의 형태가 여러 형태 (예. 글+그림)로 이루어져있다면, GET은 한번의 통신에 필요한 데이터를 모두 가져오지 않는다. 예를들어, 클라이언트가 서버의 글과 그림을 원한다고 하자. 이런 상황에서 한번의 GET으로 글과 그림을 한번에 얻어오는것은 불가능하다. 처음의 통신에서는 글의 내용과 그림의 위치를 얻을 수 있다. 그리고 그 후에 그림의 위치에 기반한 그림을 다시 요청(GET)하는 형태이다. 이렇게 여러 형태의 데이터가있을때, 분할해서 자료를 얻는 방식을 채택한다.

 

두번에 나누어 데이터를 획득

 

 

POST

POST는 서버에게 특정 정보를 전달(게시)하고 싶을 때 사용한다. 게시판에 글을 올릴때나, instagram에 사진을 올릴때, 웹브라우저를 이용해 이메일을 보내고 싶을때, 그리고 로그인을 할때 모두 POST를 사용한다. POST의 헤더의 형태는 GET과 유사하다. 헤더의 형태는 아래와 같다. Host와 User_Agent는 부가적인 정보를 알려주는 역할을 하며 매개변수라고한다. 이 매개변수까지 포함한 형태를 헤더라고한다.

 

POST /comnet/ HTTP/1.1

Host: formal.knu.ac.kr

User_Agent: Mozilla/50

 

GET은 헤더부분까지만 입력하면 필수내용이 전달되었지만, POST는 헤더를 입력하고 한줄을 띄우면 서버는 상대가 어떤 내용을 전달하려하는지 궁금해한다.POST는 게시하려는 내용을 몸통에 기입해야만이 올바른 통신이 완성된다. 몸통에는 올리고자하는 글, 사진, 이메일, 그리고 로그인 정보 따위가 기입된다. 

 

 

POST를 GET으로 대체할 수 있는 상황

POST의 목적은 특정 내용을 서버에게 전달하는 것이다. 그런데 만약 전달할 내용이 짧다면, POST를 GET으로 대체해서 사용하는 것이 가능하다. 그리고 그때 URI라는 개념이 사용된다. 예를들어, 로그인 정보(아이디와 패스워드)같은 경우는 전달하려는 정보가 짧다. 이런경우는 URL뒤에 로그인정보를 첨부하는 방법 (URI)을 사용해서 POST를 GET으로 대체할 수 있다. 아래와 같은 예시를 들 수 있다.

 

GET /comnet/?id=knu&pw=knu&action=login

Host: formal.knu.ac.kr

User_Agent: Mozilla/50

 

서버상의 자원의 위치 뒤에 인자들(로그인정보)들을 기입하는 형태이다. 이는 '나는 기입한 인자들을 가진 자원을 원해' 라는 의미이다. 그리고 이 형태 (http://formal.knu.ac.kr/comnet/?id=knu&pw=knu&action=login)는 더이상 URL이 아니게 된다. 특정 위치를 표현하는 것이아닌, 동적으로 생성된 자원을 표현하기 때문이다. 그리고 이를 URI (Universal Resource Idendifier)라고 한다.

 

다시한번 말하지만, 전달하려는 정보가 단순하며 그 내용이 짧을때 POST를 GET으로 대체할 수 있다. 그러나, 아이디나 패스워드 같이 민감한 정보를 URI에 노출시키는 것은 바람직하지 않다. 따라서 민감한 정보가 있을경우 URI에 노출시키기 보다는 POST의 BODY에 숨기는 것이 바람직하다.

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

[네트워크] HTTP 성능  (1) 2023.01.22
[네트워크] Cookie  (0) 2023.01.21
[네트워크] TCP/UDP  (0) 2023.01.07
[네트워크] 프로세스간 통신  (0) 2023.01.01
[네트워크] 계층 개요  (0) 2022.12.28
  • FTP / HTTP 복기
  • HTTP 개요
  • URL (Universal Resource Location)
  • HTTP Transaction
  • GET과 POST
  • GET
  • POST
  • POST를 GET으로 대체할 수 있는 상황
'네트워크' 카테고리의 다른 글
  • [네트워크] HTTP 성능
  • [네트워크] Cookie
  • [네트워크] TCP/UDP
  • [네트워크] 프로세스간 통신
이동준1
이동준1

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.