HTTPS 요청 처리부터 WAS 응답 반환까지의 전체 흐름

임채령·2024년 11월 17일

이전 포스팅까지 이어서 PKI와 SSL/TLS에 대해서 공부를 했으니 ! 이제 이것들이 어떻게 적용되어 흘러가는지, Spring의 환경에서는 어떤 흐름으로 동작하는지 정리해보았다 !!

1. 클라이언트 HTTPS 요청 및 SSL/TLS 설정

  1. 클라이언트가 HTTPS URL을 통해 서버로 요청
    • 사용자가 웹 브라우저를 통해 https://로 시작하는 URL에 접근한다.
    • 브라우저는 서버와 암호화된 연결을 위해 HTTPS 프로토콜을 사용한다.
  2. Client Hello 메시지 전송
    • 브라우저는 SSL/TLS 핸드셰이크를 시작한다.
    • Client Hello 메시지를 서버에 보내며, 이 메시지에는 클라이언트가 지원하는 SSL/TLS 버전, 암호화 알고리즘(Cipher Suites) 목록, 그리고 클라이언트 난수(Random Number) 등이 포함되어 있다.
  3. Server Hello와 인증서 전달
    • 서버는 클라이언트의 Client Hello를 수신하고, 서버에서 사용할 SSL/TLS 버전암호화 알고리즘을 선택한다.
    • Server Hello 메시지와 함께 SSL 인증서를 클라이언트에게 보낸다. 이 인증서에는 서버의 공개키CA의 서명이 포함되어 있다.
  4. 인증서 검증
    • 클라이언트는 받은 인증서를 검증한다.
    • 클라이언트는 CA의 공개키로 인증서의 서명을 검증하고, 서버의 공개키가 신뢰할 수 있는지 판단한다.
  5. 프리마스터 시크릿 전송 및 대칭키 생성
    • 클라이언트는 프리마스터 시크릿(Premaster Secret)을 생성하고, 서버의 공개키로 암호화하여 서버에 전송한다.
    • 서버는 자신의 개인키프리마스터 시크릿을 복호화한다.
    • 서버와 클라이언트는 서로 주고받은 난수프리마스터 시크릿을 조합해 대칭키(세션 키)를 생성한다.
  6. 암호화된 데이터 통신 준비 완료
    • 이제 클라이언트와 서버는 대칭키를 사용하여 이후의 모든 데이터를 암호화하고 복호화하면서 통신을 진행한다.

2. HTTPS 요청의 WAS 수신

  1. 로드 밸런서(선택적 단계)
    • 요청이 서버에 도달하기 전에, 큰 웹사이트나 서비스의 경우 로드 밸런서를 통해 여러 대의 서버 중 하나로 요청이 전달된다.
    • 로드 밸런서는 서버 부하를 분산시키기 위해 클라이언트의 요청을 가장 적합한 서버로 전달한다.
  2. 웹 서버 수신 (Nginx/Apache 등)
    • 서버에 도달한 요청은 웹 서버(예: Nginx, Apache)가 먼저 수신한다.
    • 웹 서버는 정적 콘텐츠(HTML, 이미지 등)를 처리하거나, 동적 요청을 처리하기 위해 WAS에 요청을 넘긴다.
  3. WAS(Web Application Server)로 전달
    • 동적 요청WAS(예: Tomcat, JBoss)로 전달된다.
    • WAS는 요청을 분석하고, 해당 요청에 대해 어떤 서블릿이나 엔드포인트가 요청을 처리해야 하는지 결정한다.

3. 쓰레드 풀(Thread Pool)에서 쓰레드 할당

  1. 쓰레드 풀에서 쓰레드 확보
    • WAS는 쓰레드 풀(Thread Pool)에서 사용 가능한 쓰레드를 확보한다.
    • 쓰레드 풀은 서버의 성능을 최적화하기 위해 일정 수의 쓰레드를 미리 생성하고 관리한다.
  2. 쓰레드 할당 및 요청 처리 준비
    • 요청이 쓰레드에 할당되면, 요청 처리를 위해 할당된 쓰레드는 서블릿 컨테이너(Servlet Container)에 요청을 전달한다.

4. 서블릿 컨테이너 및 필터(Filter) 처리

  1. 서블릿 매핑 확인
    • 서블릿 컨테이너는 요청된 URL을 기준으로 서블릿 매핑을 확인하여, 해당 요청을 처리할 서블릿을 찾는다.
  2. 필터 적용
    • 요청에 대해 필터(Filter)가 존재하는 경우, 이를 먼저 적용한다.
    • 필터는 인증/인가, 로깅, 압축 등 요청 전후 처리에 사용된다.
  3. 서블릿 호출
    • 필터 처리가 완료되면, 요청은 해당 서블릿으로 전달되어 비즈니스 로직 처리가 시작된다.

5. 비즈니스 로직 처리 및 데이터베이스 접근

  1. 비즈니스 로직 처리
    • 서블릿에서는 요청에 따른 비즈니스 로직을 처리한다. 예를 들어, 사용자가 상품을 검색하거나 주문을 요청하는 등의 작업이 여기에 해당된다.
  2. 서비스 계층 호출
    • 서블릿은 보통 서비스 계층(Service Layer)을 호출하여 구체적인 비즈니스 로직을 처리한다.
    • 서비스 계층은 필요시 DAO(Data Access Object)를 호출하여 데이터베이스에 접근한다.
  3. 데이터베이스 접근
    • DAOJDBCJPA 등을 사용해 데이터베이스에 접근하여 필요한 데이터를 조회하거나 업데이트한다.

6. 응답 생성 및 반환

  1. 응답 데이터 준비
    • 서비스 계층에서 얻은 데이터를 바탕으로 응답을 준비한다.
    • 데이터는 JSP를 통해 HTML 형식으로 변환되거나, JSON 형식으로 만들어진다.
  2. HTTP 응답 객체에 담기
    • 생성된 응답 데이터를 HTTP 응답 객체(HttpServletResponse)에 담는다.
    • 응답에는 상태 코드(예: 200 OK), 헤더 정보, 본문 데이터가 포함된다.
  3. 필터를 통한 후처리
    • 응답이 생성된 후에는, 다시 필터(Filter)를 통해 후처리가 이루어질 수 있다.
    • 예를 들어, 응답 압축이나 헤더 추가와 같은 작업이 이루어진다.

7. 쓰레드 반환 및 커넥션 종료

  1. 쓰레드 반환
    • 응답 처리가 완료되면, 사용한 쓰레드쓰레드 풀로 반환되어 다른 요청을 처리할 수 있도록 대기 상태로 돌아간다.
  2. 커넥션 유지/종료
    • 클라이언트와 서버 간의 커넥션keep-alive 설정에 따라 유지되거나 종료된다.
    • 유지된 커넥션은 다음 요청에 재사용될 수 있다.
  3. 자원 정리
    • 사용한 자원(예: 데이터베이스 연결 등)은 close() 메서드를 통해 해제하여 자원 누수를 방지한다.

8. 세션 및 쿠키 처리

  1. 세션 식별 및 유지
    • 서버는 클라이언트의 요청에 포함된 쿠키에서 세션 ID를 확인하여 기존 세션을 유지할지, 새로운 세션을 생성할지 결정한다.
  2. 세션 데이터 활용
    • 기존 세션이 존재하는 경우, 해당 세션에 저장된 데이터를 활용하여 요청을 처리한다.
  3. 세션 쿠키 설정
    • 세션 정보가 갱신되면, 서버는 Set-Cookie 헤더를 통해 새로운 세션 ID 쿠키를 브라우저에 전달할 수 있다.

이렇게 HTTPS 요청부터 WAS를 거쳐 응답이 클라이언트에게 돌아가기까지의 흐름을 세부적으로 나누어 설명해 보았다. 전체 과정을 통해 암호화된 연결 설정, 웹 서버와 애플리케이션 서버의 역할, 쓰레드 처리, 비즈니스 로직 처리, 그리고 응답 생성과 반환의 과정을 조금이나마 더 이해할수있지않을가 생각한다 !

그래도 계속 공부해야 할 것 같다 !!

0개의 댓글