• HTTP 전송이 완료된 후에 TCP 연결을 차단할 지 열어둘지를 결정
  • HTTP/2를 사용하지 않는다면 보통 HTTP/1.1을 사용 → Connection: Keep-Alive 헤더는 HTTP/1.1에서는 default이기에 문제 없음
  • HTTP/2에서는 Connection: Keep-Alive 사용 X
  • Connection 일반 헤더는 현재의 전송이 완료된 후 네트워크 접속을 유지할지 말지를 제어
  • 전송된 값이 keep-alive면, 연결은 지속되고 끊기지 않으며, 동일한 서버에 대한 후속 요청을 수행 가능
  • 커넥션을 맺고 끝는데서 발생하는 지연을 없애기 위해서 한번 연결한 TCP 커넥션을 재활용하는 방법을 지속 커넥션(Persistent Connection)이라함
  • 서버 측에서 명시적으로 접속을 끊고 싶을 경우 Connection 헤더에 Close라고 지정
  • Connection와 Keep-Alive 같은 연결-지정(Connection-specific) 헤더 필드들은 HTTP/2에서 사용 금지됨
    • 크롬과 파이어폭스는 HTTP/2 응답에서 Connection과 Keep-Alive을 무시
    • 사파리는 HTTP/2 규격 요건에 따라 해당 필드가 포함된 응답은 처리 X


Connection: Keep-Alive가 없는 경우(HTTP/1.0버전)

  • HTTP/1.1 이전에는 클라이언트와 서버 사이에 트랜잭션 한번이 일어나면 HTTP Connection 이 끊어짐
  • TCP 커넥션을 맺는데 발생하는 지연과 느린 시작 지연이 트랜잭션마다 발생하기 때문에, 한 웹페이지에서 여러 이미지와 HTML을 요청해야 하는 경우 성능이 매우 안 좋아짐
  • 지속 커넥션(Persistent connetion)을 HTTP/1.0에서 활용하기 위해는 특정한 헤더들을 추가해줘야함
  • 지속 커넥션을 사용하기 위해서 활용하는 헤더는 Connection헤더와 Keep-Alive헤더
  • HTTP 요청을 보낼때 Connection: Keep-Alive와 같이 Connection 헤더에 Keep-Alive를 보낼 수 있음
  • 클라이언트 측에서 커넥션을 유지하기를 바라는 요청하지만, 서버가 Connection: Keep-Alive를 지켜준다는 보장은 없음


Connection 헤더의 두가지 기능

1. Connection 헤더는 중간에 위치한 프록시 서버에게 실제 서버로 전달하지 말아야 할 헤더를 알려주는 역할 → 기능은 있지만 활용 X

  • 아래 그림처럼 프록시 서버를 통해 실제 웹서버로 전달되지 말아야 할 헤더 정보(Upgrade 헤더 정보)를 Connection에 명시하면, 프록시 서버는 명시된 헤더는 실제 웹서버로 전달 X
  • 실제로 활용되는 사례를 찾기 어려움

2. HTTP는 Connection 헤더를 통해 연결 유지 기능(Persist Connection)을 관리

  • Connection 헤더를 통해 연결을 즉시 끊을 수도 있고, 또는 연결 유지를 지속적으로 가능함
  • 연결 유지(Persist Connection)는 HTTP 1.1 의 기본 동작 → default 설정
  • 하나의 TCP 연결을 통해 동일한 웹서버에 여러개의 HTTP 트랜잭션을 수행 가능 → 연결 유지 기능(Persist Connection)를 통해 가능
  • 연결 유지 기능을 사용하지 않고자 하는 경우 → Connection 헤더에 close 값을 명시

    • 웹서버는 해당 요청을 받게 되면 요청한 컨텐츠에 대해 응답하고 바로 세션을 끊게 됨
    • Connection: close는 요청 또는 응답 모두 사용 가능
      Connection: close
  • 연결 유지 기능을 사용하고자 하는 경우에는 Connection 헤더에 내용을 추가

    • Connection: Keep-Alive를 통해 연결 유지 기능을 사용
    • Keep-Alive 헤더는 옵션으로 연결 유지를 얼마나 할것인지 초단위로 정의가 가능
      GET / HTTP /1.1
      Connection: Keep-Alive
      Keep-Alive: timeout=10

  • 웹서버가 연결 유지를 지원하는 경우 아래와 같은 응답헤더 내용을 확인 가능

    • 응답 헤더에서도 Connection: Keep-Alive를 통해 연결 유지 기능을 사용할 수 있음을 확인 가능
    • Keep-Alive 헤더는 옵션으로 연결 유지를 얼마나 할것인지 초단위로 정의가 가능
      HTTP /1.1 200 OK
      Connection: Keep-Alive
      Keep-Alive: timeout=10, max=120
      Content-Type: text/html


다음(www.daum.net) 메인 페이지를 접속한 헤더 정보

  • 클라이언트는 연결유지를 사용하기 위해 Connection: Keep-Alive 헤더를 전송
  • 클라이언트에 Keep-Alive 요청을 하였지만, 서버에서는 연결유지를 사용하지 않고 응답과 함께 세션을 끊어버림
  • HTTP 요청에 대해 HTTPS 접속으로 리다이렉트 하기 위한 것 → HTTP 요청에 대해서는 끊어버리고, 새로 HTTPS 접속 요청
  • http://www.daum.net으로 요청

보배드림(https://www.bobaedream.co.kr/) 메인 페이지를 접속한 헤더 정보

  • 클라이언트와 서버에서 모두 연결 유지를 사용
    • Connection: kepp-alive 설정
    • Keep-Alive: timeout=15, max=9999 → 연결 유지를 기본 15초이며, 연결 최대 횟수를 9999회로 정의
  • 서버에서 연결 유지를 얼만큼 할것인지에 대해 추가적인 정보를 Keep-alive 헤더를 통해 클라이언트에게 전달

Connection의 Keep Alive

  • 연결된 socket에 IN/OUT의 access가 마지막으로 종료된 시점부터 정의된 시간까지 access가 없더라도 대기하는 구조
  • 정의된 시간내에 access가 이루어진다면 계속 연결된 상태를 유지
  • time out 내에 requset 재요청시 이미 열려있는 port로 연결


문법

Connection: keep-alive
Connection: close

디렉티브

  1. close
    • 클라이언트 혹은 서버가 연결을 닫으려고 하는 것
    • HTTP/1.0 요청에서 기본 값
  1. 쉼표로 구분된 HTTP 헤더 목록 [보통 keep-alive 만 해당]
    • 클라이언트가 연결을 열린 상태로 유지하려는 것
    • 영속적인 연결을 가지는 것은 HTTP/1.1 요청의 경우 기본
    • 헤더 목록은 첫번째 반투명 프록시 혹은 중간 캐시에 의해 제거될 헤더의 이름
    • 헤더들은 목적지 노드가 아닌 (요청) 발행자와 첫번째 개체 사이의 연결을 정의

+ Recent posts