본문 바로가기
TIL

[231117] HTTP 요청 ~ 응답의 과정 (Feat. todoapp)

by 진진리 2023. 11. 17.
728x90

 

웹에서의 클라이언트와 서버 간의 요청과 응답 사이의 과정에 대해 잘 정리되어 있지 않다보니

Spring security도 잘 이해가 되지 않는 것 같아 한번 정리해보려고 한다.

 


HTTP의 동작 과정

 

  1. 서버 접속
  2. 클라이언트 요청
  3. 서버 응답
  4. 연결 종료

 

1. 서버 접속

1-1. 사용자가 웹 브라우저에 URL 주소를 입력
  • URL: 클라이언트가 서버를 지칭할 때 사용되는 주소
    • 프로토콜, 연결하고자 하는 서버의 호스트 이름, 서버 내부의 파일 경로명으로 표현

 

1-2. DNS 서버에 웹 서버의 호스트이름을 IP 주소로 변경 요청
  • DNS(Domain Name System): 주소와 이름 정보를 자동으로 유지하고 관리하는 분산 데이터베이스 시스템
    • Domain name(호스트 이름) <-> IP 주소 변환 기능 수행
    • 호스트 주소와 이름 정보는 Name Server라는 특정한 관리 호스트가 유지
    • 주소 변환 작업이 필요한 클라이언트는 네임서버에 요청해 IP 주소를 얻음
  • 도메인의 계층 관계

 

 

  • DNS 동작 방식
    • 도메인 정보를 분산해서 저장
    • 루트 DNS 서버, 최상위 DNS 서버, 책임 DNS 서버...
    • 가장 가까운 DNS 서버(클라이언트에 기본적으로 등록되어 있는 DNS 서버)가 IP를 알고 있다면 직접 IP 주소를 알려줌
      • 모른다면 루트 도메인 네임서버에게 문의. 루트 도메인 서버는 문의할 하위 계층의 네임 서버(.com)를 알려줌
      • 이러한 과정을 반복

 

1-3. 웹 서버와 TCP 연결 시도: 3 way handshaking

 

  • Well-known 포트인 80번 포트로 TCP 연결

  • 3-way handshake
    1. (Seq=x, SYN) : A 프로세스가 임의의 송신 순서 번호 x를 지정한 세그먼트를 전송하여 연결 설정을 요청
    2. (Seq=y, Ack=x+1, SYN, ACK): 수신한 B 프로세스는 연결 설정 요구에 대한 긍정 응답으로 SYN과 ACK 플래그를 지정.
      • SYN 세그먼트의 순서 번호에 x에 1을 더한 x+1을 Acknowledgement Number 필드에 지정해 회신
      • B 프로세스의 임의의 순서 번호 y를 담아 세그먼트 전송
      • 이때 순서 번호 y를 자신의 초기 송신 번호를 알려주기 위해 사용
    3. (Seq=x+1, Ack=y+1, ACK) : 응답을 받은 A 프로세스는 이를 잘 받았다고 다시 응답
      • 이때 전송할 데이터가 있으면 데이터 전송과 함께 응답 기능을 수행

 

2. 클라이언트 요청

2-1. HTTP Request

요청 메시지 구조

2-2. Spring Security : Filter
  • 서블릿 컨테이너: 필터와 서블릿으로 구성

 

  • Servlet 동작 순서
    • WAS는 HTTP 요청 메시지를 기반으로 새로운 Request, Response 객체를 생성
    • WAS는 만들어진 Request, Response 객체를 서블릿 컨테이너에 넘겨주며 ExampleServlet 호출
    • WAS는 Response 객체정보로 HTTP 응답 메시지 생성
  • HttpServletRequest 객체의 역할
    • 요청 정보 검색: 중요한 세부 정보를 추출하는 방법을 제공
    • 매개변수 처리: 클라이언트가 보낸 매개변수에 액세스하는 방법을 제공
    • 세션 관리
    • 요청 속성 조작
  • 필터

  • Spring Security는 인증 및 인가를 처리하기 위해 Filter를 사용하는데 FilterChainProxy를 통해 상세 로직을 구현
    • SecurityFilterChain을 통해 많은 Filter 인스턴스에 위임할 수 있음
    • 설정에 따라 SecurityFilterChain이 하나가 될 수 있고 여러개도 될 수 있음
  • SecurityConfig에서 선언된 대로 필터를 생성하여 FilterChainProxy로 전달
@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        
        //...(생략)...

        // 필터 관리
        http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class);
        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

 

  • WebSecurityConfig에서 HttpSecurity의 addFilterBefore 메소드를 통해 위와 같이 필터를 등록해준다.
  • jwtAuthernticationFilter는 UsernamePasswordAuthenticationFilter의 자식 클래스이다.

todoapp에서 디버깅했을 때 흐름은 대충 이렇다

 

  • UsernamePasswordAuthenticationFilter에서의 흐름

  1. AuthenticationFilter가 HTTP Request를 받음
  2. 요청의 Id, Password를 이용하여 AuthenticationToken 생성
  3. AuthenticationManager가 토큰을 받아 AuthenticationProvider에게 넘겨줌
  4. UserDetailsService로 토큰을 전달해 DB에 ID의 존재를 확인하여 DB의 회원정보를 UserDetails 객체로 받환받음
  5. AuthenticationProvider는 반환받은 UserDetails 객체와 실제 사용자의 입력정보를 비교
  6. 비교가 완료되면 사용자 정보를 가진 Authenticaion 객체를 SecurityContextHolder에 담아 AuthenticationSuccessHandle을 실행

 

2-3. DispatcherServlet
  • Spring MVC
    • DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데 이는 Front Controller 패턴으로 설계되어있다
      • HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아 적합한 컨트롤로에 위임해주는(Handler mapping) 프론트 컨트롤러

동작 방식

 

  • Servlet
    • HTTP 프로토콜 기반 요청 및 응답을 처리하는데 사용됨
    • 자바에서 Servlet은 HttpServlet 클래스를 상속받아 구현됨
  • Servlet이 하는 일
    • 서버와 TCP/IP 연결, 소켓 연결
    • HTTP 요청 메시지 Parsing 후 READ
    • ...
    • HTTP 응답 메시지 생성
    • TCP/IP 응답 전달, 소켓 연결 종료
    •  => Servlet을 지원하는 WAS를 사용하면 비즈니스 로직에만 집중 가능!
2-4. 컨트롤러 등에서 비즈니스 로직 처리

 

3. 서버 응답

컨트롤러에서 데이터 반환 -> 서블릿 컨테이너에서 doGet(), doPost() 등 메소드 호출 -> HttpServletResponse -> Http response

 

4. 연결 종료

  • 4 way handshaking
    1. 데이터를 받은 클라이언트가 연결을 해제하고자 FIN 플래그를 지정해 요구
    2. 서버는 이에 대한 응답으로 ACK를 보내면서 애플리케이션의 소켓을 닫음
    3. 서버는 애플리케이션에 종료를 알리고 클라이언트에게 FIN 플래그를 보냄
    4. 클라이언트는 이에 대한 ACK를 전송하고 일정 시간 이후 CLOSED 상태가 됨
    5. ACK를 받은 서버 역시 CLOSED 상태가 됨

참고

쉽게 배우는 데이터 통신과 컴퓨터 네트워크

https://sudo-minz.tistory.com/13

https://velog.io/@averycode/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-HTTP%EC%99%80-HTTPS-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95

https://velog.io/@yaho1024/Spring-Security-FilterChainProxy

https://velog.io/@chullll/Spring-Security-JWT-%ED%95%84%ED%84%B0-%EC%A0%81%EC%9A%A9-%EA%B3%BC%EC%A0%95

https://ch4njun.tistory.com/236

https://ugo04.tistory.com/157

https://seongonion.tistory.com/74