728x90
웹에서의 클라이언트와 서버 간의 요청과 응답 사이의 과정에 대해 잘 정리되어 있지 않다보니
Spring security도 잘 이해가 되지 않는 것 같아 한번 정리해보려고 한다.
HTTP의 동작 과정
- 서버 접속
- 클라이언트 요청
- 서버 응답
- 연결 종료
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
- (Seq=x, SYN) : A 프로세스가 임의의 송신 순서 번호 x를 지정한 세그먼트를 전송하여 연결 설정을 요청
- (Seq=y, Ack=x+1, SYN, ACK): 수신한 B 프로세스는 연결 설정 요구에 대한 긍정 응답으로 SYN과 ACK 플래그를 지정.
- SYN 세그먼트의 순서 번호에 x에 1을 더한 x+1을 Acknowledgement Number 필드에 지정해 회신
- B 프로세스의 임의의 순서 번호 y를 담아 세그먼트 전송
- 이때 순서 번호 y를 자신의 초기 송신 번호를 알려주기 위해 사용
- (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의 자식 클래스이다.
- UsernamePasswordAuthenticationFilter에서의 흐름
- AuthenticationFilter가 HTTP Request를 받음
- 요청의 Id, Password를 이용하여 AuthenticationToken 생성
- AuthenticationManager가 토큰을 받아 AuthenticationProvider에게 넘겨줌
- UserDetailsService로 토큰을 전달해 DB에 ID의 존재를 확인하여 DB의 회원정보를 UserDetails 객체로 받환받음
- AuthenticationProvider는 반환받은 UserDetails 객체와 실제 사용자의 입력정보를 비교
- 비교가 완료되면 사용자 정보를 가진 Authenticaion 객체를 SecurityContextHolder에 담아 AuthenticationSuccessHandle을 실행
2-3. DispatcherServlet
- Spring MVC
- DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데 이는 Front Controller 패턴으로 설계되어있다
- HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아 적합한 컨트롤로에 위임해주는(Handler mapping) 프론트 컨트롤러
- DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데 이는 Front Controller 패턴으로 설계되어있다
- 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
- 데이터를 받은 클라이언트가 연결을 해제하고자 FIN 플래그를 지정해 요구
- 서버는 이에 대한 응답으로 ACK를 보내면서 애플리케이션의 소켓을 닫음
- 서버는 애플리케이션에 종료를 알리고 클라이언트에게 FIN 플래그를 보냄
- 클라이언트는 이에 대한 ACK를 전송하고 일정 시간 이후 CLOSED 상태가 됨
- ACK를 받은 서버 역시 CLOSED 상태가 됨
참고
쉽게 배우는 데이터 통신과 컴퓨터 네트워크
https://sudo-minz.tistory.com/13
https://velog.io/@yaho1024/Spring-Security-FilterChainProxy
https://ch4njun.tistory.com/236
https://seongonion.tistory.com/74
'TIL' 카테고리의 다른 글
[231122] ResponseDto, RequestDto에 Getter가 필요한 이유 (0) | 2023.11.22 |
---|---|
[231120] Spring 숙련주차 개인과제 해설 (0) | 2023.11.20 |
[231116] Spring 숙련주차 개인과제 (0) | 2023.11.16 |
[231116] Access Token과 Refresh Token (0) | 2023.11.16 |
[231115] HttpMediaTypeNotAcceptableException 에러 해결 (0) | 2023.11.15 |