6. HTTP

HTTP(Hypertext Transfer Protocol)는 서버와 웹 클라이언트가 서로 대화하는 방법을 
정의한 표준이다. HTTP는 바이트로 표현될 수 있는 모든 파일의 전송에 사용될 수 있다.

프로토콜

HTTP 프로토콜

  • 웹브라우저 ↔ 서버간 통신을 위한 표준 프로토콜

- 클라이언트와 서버가 연결을 맺는 방법
- 클라이언트가 서버에게 데이터를 요청하는 방법
- 서버가 요청에 응답하는 방법
- 연결 종료
  1. 클라이언트가 서버의 해당 포트로 TCP 연결을 함.(기본 80, 다른포트는 URL에 명시)

  2. 클라이언트가 리소스를 요청하는 메시지를 서버로 보낸다.

  3. 서버는 클라이언트에게 응답을 보낸다

  4. 서버는 연결을 종료한다.

  • HTTP 1.1 이후에는 단일 TCP 연결을 통해 요청과 응답을 연속해서 보낼 수 있다. 위의 1,4번 사이의 2,3번 동작을 여러번 반복할 수 있다. 또한 HTTP 1.1에선 요청과 응답을 chunk단위로 보낼 수 있다.

[예시]

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
  • Keyword : Value 쌍인 형태로 구성

    • Value부분은 대소문자를 가리기도 함.

  • User-Agent : 접속에 사용된 브라우저의 종류를 서버에게 알려줌

  • Accept : 클라이언트가 처리할 수 있는 데이터 타입을 서버에게 알려줌

  • Host : 동일한 IP에서 서비스되는 서로 다른 이름의 host를 서버가 구분하는데 사용됨

  • MIME 타입은 타입과 서브타입 두 레벨로 분류됨

Keep-Alive

참고 : https://young1403.tistory.com/83arrow-up-right

  • HTTP 1.0은 요청마다 새로운 연결을 함.

  • HTTP 1.1은 서버가 응답 후 소켓을 닫지 않고 요청/응답이 계속해서 이루어짐

    • HTTP request header의 Connection 필드의 값을 Keep-Alive로 설정하여 소켓을 재사용할 것임을 표시함.

  • JAVA의 URL class는 Keep-Alive 기능이 default

    • Keep-Alive 설정을 켜거나 끄기위해 http.keepAlive 로 설정 가능

    • http.maxConnections 속성에 동시에 유지할 열린 소켓의 최댓값 설정 가능. (기본 5)

    • http.keepalive.remainingData : 연결이 끝난 후 java가 커넥션을 정리할 수 있도록 true로 설정.(default : false)

    • sun.net.http.errorstream.enableBuffering :

      값을 true로 설정 → 재사용을 위해 빨리 해제될 수 있음. (default : false)

    • sun.net.http.errorstream.bufferSize :

      에러 스트림 버퍼링을 위해 사용할 바이트 수를 설정. 기본값은 4096 byte

    • sun.net.http.errorstream.timeout

      에러 스트림으로부터 읽기 타임아웃 값을 밀리세컨드 단위로 설정. 기본값 300ms

  • HTTP 2.0 in JAVA

    • springboot에서 http2.0 설정 가능 : server.http2.enabled=true

    • 헤더 압축, request/response pipelining, 비동기연결 멀티플렉싱 등 HTTP 전송을 최적화 함.

      하지만 transport-layer에서 수행되기에 application-layer 의 프로그래머에게 자세한 내용은 노출되지 않는다.

쿠키

많은 웹 사이트는 지속적인 클라이언트 측의 상태를 저장하기 위해 cookie라고 알려진 텍스트의 작은 문자열을 사용함. 쿠키는 서버에서 클라이언트로 전달되고 HTTP 요청과 응답의 헤더를 통해 다시 전달된다. 쿠키는 세션 ID, 쇼핑카트, 로그인 자격 정보, 사용자 설정과 같은 것들을 표시하기 위해 서버에 의해 사용된다. 일반적으로 쿠키는 데이터를 직접 저장하기 보다는 서버상의 데이터 위치를 가르키고 있다.

  • 쿠키에는 공백 문자, 콤마, 세미콜론을 제외한 아스키문자만 사용해야 한다.

  • HTTP 헤더에 Set-Cookie 헤더를 포함시킴 ex) Set-Cookie : cart=ATVPDKENwdkWO

  • HTTP 연결 자체는 어떠한 상태값을 갖지않음. 하지만 cookie를 이용하면 세션 추적이 가능해짐

  • 하나 이상의 쿠키를 설정할 수 있음

  • key=value 쌍 외에도 유효기간, 경로 도메인, 포트, 버전, 보안 옵션과 같은 쿠키 자신의 범위를 제어하는 다양한 속성 설정이 가능함.

  • 쿠키의 범위는 자신이 생성된 URL과 모든 서브 디렉터리

  • HTTP Set-Cookie

    Set-Cookie: <name>=<value>[; <Max-Age>=<age>] `[; expires=<date>][; domain=<domain_name>] [; path=<some_path>][; secure][; HttpOnly]

    • Max-Age : 설정된 초만큼의 시간이 경과한 뒤 이 쿠키를 삭제

    • 안전하게 전송하기 위해 HTTP대신 HTTPS 사용

    • secure 속성 : 쿠키에 대해 안전하게 전송하기 위한 설정. HTTPS가 아닌 통신에서는 쿠키를 전송하지 않음

    • HttpOnly 속성 : HTTP와 HTTPS를 통해서만 쿠키 값을 반환하도록 설정. 특시 JavaScript를 통해 해당 쿠키에 접근할 수 없도록 함.

  • CookieManager Class

    자바에서 기본적으로 CookieManager가 활성화되어 있지 않기 때문에, java가 쿠키를 저장하거나 반환받기 전에 활성화시켜야 한다.

  • CookieStore Class

    때로 로컬에 쿠키를 저장하고 꺼내야 할 필요가 있음. 애플리케이션은 종료시, 쿠키를 로컬 디스크에 저장하고 다음 실행 시에 저장된 쿠키를 다시 읽어 사용한다. CookieManager의 getCookieStore() 메서드는 CookieManager 클래스의 저장소를 반환한다.

    CookieStore 클래스를 사용하면 쿠키를 추가, 삭제 및 나열할 수 있음.

    HTTP request/response의 일반적인 흐름을 벗어나 전송된 쿠키를 제어할 수 있게됨

    저장소의 각각의 쿠키들은 HttpCookie Class 객체에 담겨있고 내부 메서드를 통해 쿠키 속성을 확인할 수 있음.

Last updated