6. HTTP
프로토콜
HTTP 프로토콜
웹브라우저 ↔ 서버간 통신을 위한 표준 프로토콜
클라이언트가 서버의 해당 포트로 TCP 연결을 함.(기본 80, 다른포트는 URL에 명시)
클라이언트가 리소스를 요청하는 메시지를 서버로 보낸다.
서버는 클라이언트에게 응답을 보낸다
서버는 연결을 종료한다.
HTTP 1.1 이후에는 단일 TCP 연결을 통해 요청과 응답을 연속해서 보낼 수 있다. 위의 1,4번 사이의 2,3번 동작을 여러번 반복할 수 있다. 또한 HTTP 1.1에선 요청과 응답을 chunk단위로 보낼 수 있다.
Keyword : Value 쌍인 형태로 구성
Value부분은 대소문자를 가리기도 함.
User-Agent : 접속에 사용된 브라우저의 종류를 서버에게 알려줌
Accept : 클라이언트가 처리할 수 있는 데이터 타입을 서버에게 알려줌
Host : 동일한 IP에서 서비스되는 서로 다른 이름의 host를 서버가 구분하는데 사용됨
MIME 타입은 타입과 서브타입 두 레벨로 분류됨
Keep-Alive
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