2017년 11월 13일 월요일

Chapter7. HTTP 통신


학습 목표


  1. HTTP 통신의 특징을 이해할 수 있습니다.
  2. HTTP 통신을 다루는 HTTP 모듈 사용 방법을 알 수 있습니다.
  3. HTTP 서버와 클라이언트 클래스와 주요 메소드를 알 수 있습니다.

1. HTTP 통신

◎ HTTP
  • 웹(WWW)의 주역!
  • HTTP : Hyper Text Transfer Protocol
  • 하이퍼 텍스트 - 하이퍼 링크로 논리적으로 연결된 문서
  • ex) HTML
◎ HTTP 통신의 특징
▷ HTTP 통신
  • 요청(Request)
  • 응답(Response)
▷ 요청과 응답 과정
  • 웹 브라우저 → 주소 입력 → 요청 → 웹 서버 → 응답 → 웹 브라우저
◎ HTTP 통신

◎ URL
▷ 리소스의 위치 : URL(Uniform Resource Locator)
  • http://username:password@host:8080/directory/file?query#ref:
◎ URL 인코딩
▷ URL에 허용되는 문자
  • 알파벳, 숫자, 하이픈, 언더스코어, 점 틸드
▷ URL 인코딩하기
  • https://www.google.com/search?q=아이폰
  • https://www.google.com/search?q=%EC%95%84%EC%9D%B4%ED%8F%B0
◎ 웹 브라우저에서 요청/응답 확인해보기
▷ 웹브라우저
  • 개발자 도구


2. HTTP 요청

◎ HTTP 메시지 구조
▷ 요청 메시지
  • 요청 라인
  • 요청 헤더
  • 요청 바디(엔티티)
http body를 사용하지 않는 요청 메시지

◎ 요청 라인
  • 요청 메소드
  • 요청 URL
  • HTTP 버전
    GET http://en.wikipedia.org/wiki/The_Scream HTTP/1.1
◎ HTTP 메소드
  • HTTP 메소드 : 리소스를 다루는 행위
    GET : 리소스를 얻어오는 요청
    POST : 리소스 전송 요청
    PUT : 저장 요청(수정)
    DELETE : 삭제
    . . . 
◎ 요청 헤더

  • 헤더는 키 : 값 방식으로 작성
▷ 주요 요청 헤더
Accept : 클라이언트가 받을 수 있는 컨텐츠
Cookie : 쿠키
Content-Type : 메시지 바디(엔티티)의 종류
Content-Length : 메시지 바디의 길이
if-Modified-Since : 특정 날짜 이후에 변경됐을 때만

◎ 요청 정보 전달
▷ URL을 이용해서 요청 정보 전달
  • GET 메소드, TRACE 메소드 : 메시지 바디를 사용하지 않으므로 URL만으로 클라이언트가 원하는 정보를 전달
▷ 경로와 쿼리 스트링 사용
  • http://idols.com/snsd/taeyon.png
  • http://idols.com/q?group=snsd&name=jessica
▷ 메시지 바디를 사용하지 않는다.

◎ 요청 정보 전달
▷ URLEncoded 방식
▷ 메시지 헤더(컨텐츠 타입)
  • application/x-www-form-urlencoded
▷ 메시지 바디 : 쿼리 문자열
▷ 메시지 예
Content-Type : application/x-www-form-urlencoded
title=Madmax&Director=George+Miller

◎ 요청 정보 전달
▷ JSON/XML
▷ 메시지 헤더(컨텐츠 타입)
  • application/json
▷ 메시지 예
Content-Type:application/json
{
    "name":"iu", "best":"좋은 날"
}

◎ 요청 정보 전달
▷ 멀티 파트를 이용한 요청 정보 전달
  • 바이너리 파일을 올리는 경우에 주로 사용
  • 하나의 메시지 바디에 파트를 나눠서 작성
▷ 메시지 헤더

  • 컨텐츠 타입 ; 파트 구분자(boundary)
  • multipart/form-data; boundary=frontier
▷ 각 파트별 컨텐츠 타입
▷ 파트로 구성된 바디

◎ 요청 정보 전달
▷ 요청 정보 전달
  • 메시지 바디를 사용 여부
  • 바디의 인코딩 방식
▷ URL로 요청 정보 전달 : 바디 분석 불필요

3. HTTP 응답

◎ HTTP 메시지 구조
▷ 응답 메시지
  • 응답 라인
  • 응답 헤더
  • 응답 바디
◎ HTTP 메시지
◎ 응답 메시지
▷ 응답 라인
  • 버전
  • 상태 코드
  • 상태 메시지 → HTTP/1.1 200 OK
◎ 상태 코드
▷ 상태 코드 : 서버의 응답 코드
▷ 대 분류
  • 1xx : 정보
  • 2xx : 성공
  • 3xx : 리다이렉션
  • 4xx, 5xx : 오류
▷ 상태 코드 : 2xx
  • 200 : OK. 요청 성공
  • 201 : Created. 생성 요청 성공
  • 202 : Accepted : 요청 수락. 요청 처리는 보장 안됨
  • 203 : Non-authoritavive Information
  • 204 : Non Content...
▷ 상태 코드 : 3xx
  • 300 : Multiple choices. 여러 리소스에 대한 요청 결과 목록
  • 301, 302, 303 : Redirect. 리소스 위치가 변경된 상태
  • 304 : Not Modified. 리소스가 수정되지 않았음...
▷ 상태 코드 : 4xx
  • 400 : Bad Request. 요청 오류, 요청을 처리하는 필수 데이터가 없는 경우
  • 401 : Unauthorized. 권한 없는 상태
  • 403 : Forbidden. 요청 거부 상태
  • 404 : Not Found. 리소스가 없는 상태...
▷ 상태 코드 : 5xx
  • 500 : Internal Server Error. 서버가 요청 처리를 못하는 상태
  • 501 : Not Implemented. 서버가 지원하지 않는 요청
  • 503 : Service Unavailable. 과부하 등으로 당장 서비스가 불가능한 상태 ...
◎ 응답 메시지 헤더
▷ 응답 메시지 헤더
▷ 주요 헤더 필드
  • Content-Type : 바디 데이터의 타입
  • Content-Length : 바디 데이터 크기
  • Set-Cookie : 쿠키 설정
  • ETag : 엔티티 태그
◎ 응답 메시지 바디
▷ 바디 데이터
  • HTML
  • XML/JSON
  • Octet Stream 등
▷ 바디 기록 방식 : Content-Type 헤더 필드

▷ 컨텐츠 타입
  • 메시지 헤더에 기록
  • 필드 이름 content-type
  • 대분류/소분류
▷ 주요 컨텐츠 타입
  • text/plain, text/html
  • application/xml, application/json
  • image/png, image/jpg
  • audio/mp3, video/mp4
◎ 응답 메시지
▷ HTML 응답 메시지 헤더
  • content-type:text/html
▷ HTML 응답 메시지 바디
<html>
<body>
<h1>Hello Node.js</h1>
</body>
</html>

▷ HTML 응답 메시지 헤더
  • content-length: 73228
  • content-type: image/jpeg
▷ HTML 응답 메시지 바디 - 이미지를 헥사타입으로 출력

◎ 응답 메시지
  • 컨텐츠 타입이 안 맞으면?
  • 컨텐츠 타입 : application/json
  • 실제 바디 데이터 : 이미지
  • 제대로 표현하지 못한다.

4. HTTP 모듈

◎ HTTP 모듈
▷ HTTP 모듈, 기본 모듈
  • var http = require('http');
▷ HTTP 서버
  • 클라이언트의 요청 메시지 수신
  • 클라이언트에게 응답 메시지 전송
▷ HTTP 클라이언트
  • 서버로 요청 메시지 전송
  • 서버의 응답 메시지 수신
◎ HTTP 모듈 클래스
▷ 서버용 클래스
  • http.Server : HTTP 서버
  • http.IncomingMessage : HTTP 서버의 요청 메시지, Readable Stream
  • http.ServerResponse : HTTP 서버의 응답 클래스
▷ HTTP 클라이언트
  • http.Client : HTTP 클라이언트
  • http.ClientRequest : HTTP 클라이언트 요청 메시지
  • http.IncomingMessage : HTTP 서버의 응답 메시지, Readable Stream
◎ HTTP 모듈

5. HTTP 서버

◎ HTTP 서버
▷ HTTP 서버
  • http.Server
▷ HTTP 서버 생성
  • var server = http.createServer([requestListener])
▷ HTTP 서버 주요 이벤트
  • request : 클라이언트의 요청 도착
  • connection : 소켓 연결
  • close : 서버 종료
▷ HTTP 서버 메소드
  • server.listen()
  • server.close()
  • server.setTimeout()
◎ HTTP 서버
▷ HTTP 서버 동작시키기

  • 서버 객체 생성
  • 클라이언트 접속 대기(listening)
    var server = http.createServer();
    server.listen(PORT);
▷ 포트
  • 0~1023 : well-known port, 미리 정의된 포트, 관리자 권한 필요
  • 1024 ~ 49151 : registered port
  • 49151 ~ 65535 : dynamic port
▷ 포트 바인딩 실패
  • 이미 사용 중
  • 권한 없음
▷ 서버와 이벤트 리스너
var http = require('http');
var server = http.createServer();
server.on('request', function(request, response) {
});
server.on('connection', function(socket) {
    console.log('connection event');
});
server.on('close', function() {
    console.log('close');
});
server.listen(3000);

▷ HTTP 서버 request 이벤트 리스너
var http = require('http');
var server = http.createServer(function(req, res) {
    res.end('Hello World');
}).listen(3000);

웹 브라우저 : http://127.0.0.1:3000

6. HTTP 클라이언트

◎ HTTP 클라이언트
▷ 클라이언트 객체
  • http.create([port][, host]) // deprecated
▷ 클라이언트 요청
  • http.request(options[, callback])
▷ 바디 없이 요청 보내기(GET)
  • http.get(options[, callback])

학습정리

◎ 지금가지 'HTTP 통신'에 대해 살펴보았습니다.
  • HTTP 통신
    요청과 응답 메시지를 사용하는 HTTP 통신을 알아봤고, 메시지 구조를 알아봤습니다.
  • HTTP 모듈
    HTTP 통신 기능을 제공하는 HTTP 모듈을 알아봤습니다.
  • HTTP 서버
    HTTP 모듈 중 서버를 작성하는 클래스와 이벤트를 알아봤습니다.
  • HTTP 클라이언트
    HTTP 모듈 중 클라이언트를 작성하는 데 필요한 기능을 간단히 알아봤습니다.





댓글 없음: