https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md 의 내용을 다룸
🧚♀️ Prep
해당 내용을 정확히 이해하기 위해서는 아래의 게시글을 정독하고 오시는것을 추천 드립니다 🧚♀️
🧚♀️ HTTP의 동작과정
이전 포스트에서 HTTP는 Stateless
한 프로토콜인 것을 확인했다. 즉, 각 요청은 독집적인 트랜잭셔으로 클라이언트가 서버에게 요청하기 전에 연결(connect
)하는 과정이 필요하고, 서버의 응답을 받으면 종료(close
)한다.
서버 접속 -> 클라이언트 -> 요청 -> 서버 -> 응답 -> 클라이언트 -> 연결 종료
- 사용자가 웹 브라우저에 URL 주소를 입력한다.
- DNS 서버에 웹 서버의 호스트 이름을 IP 주소로 변경 요청한다.
- 웹서버와 TCP 연결을 시도한다.
- 클라이언트가 서버에게 요청한다.
- HTTP Request Message = Request Header + 빈 줄 + Request Body
- Request Header
- 요청 메소드 + 요청 URI + HTTP 프로토콜 버전
GET /background.png HTTP/1.0
POST / HTTP 1.1
- Header 정보(key-value 구조)
- 빈 줄
- 요청에 대한 모든 메타 정보가 전송되었음을 알리는 용도
- Request Body
- GET, HEAD, DELETE, OPTIONS처럼 리소스를 가져오는 요청은 바디 미포함
- 데이터 업데이트 요청과 관련된 내용 (HTML 폼 콘텐츠 등)
5. 서버가 클라이언트에게 데이터를 응답한다.
- HTTP Response Message = Response Header + 빈 줄 + Response Body
- Response Header
- HTTP 프로토콜 버전 + 응답 코드 + 응답 메시지
- ex. HTTP/1.1 404 Not Found.
- Header 정보(key-value 구조)
- 빈 줄
- 요청에 대한 모든 메타 정보가 전송되었음을 알리는 용도
- Response Body
- 응답 리소스 데이터
- 201, 204 상태 코드는 바디 미포함
- 서버 클라이언트 간 연결종료 (stateless의 특징이 나타남)
- 웹 브라우저가 웹 문서 출력
요청메소드
서버에게 요청의 종류를 알려주기 위해 사용한다.
- GET : 정보를 요청하기 위해 사용(SELECT)
- POST : 정보를 밀어넣기 위해 사용(INSERT)
- PUT : 정보를 업데이트하기 위해서 사용(UPDATE)
- DELETE : 정보를 삭제하기 위해서 사용(DELETE)
- HEAD : (HTTP)헤더 정보만 요청. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해 사용.
- OPTIONS : 웹 서버가 지원하는 메서드의 종류를 요청.
- TRACE : 클라이언트의 요청을 그대로 반환. 주로 echo 서비스로 서버 상태를 확인하기 위한 목적으로 사용.
🧚♀️ HTTPS(SSL)의 동작과정
- 공개키 암호화 방식과 대칭키 암호화 방식의 장점을 활용해 하이브리드 사용
- 데이터를 대칭키 방식으로 암복호화하고, 공개키 방식으로 대칭키 전달
-
클라이언트가 서버 접속하여 Handshaking 과정에서 서로 탐색
1.1. Client Hello
- 클라이언트가 서버에게 전송할 데이터
- 클라이언트 측에서 생성한 랜덤 데이터
- 클-서 암호화 방식 통일을 위해 클라이언트가 사용할 수 있는 암호화 방식
- 이전에 이미 Handshaking 기록이 있다면 자원 절약을 위해 기존 세션을 재활용하기 위한 세션 아이디
1.2. Server Hello
- Client Hello에 대한 응답으로 전송할 데이터
- 서버 측에서 생성한 랜덤 데이터
- 서버가 선택한 클라이언트의 암호화 방식
- SSL 인증서
1.3. Client 인증 확인
- 서버로부터 받은 인증서가 CA에 의해 발급되었는지 본인이 가지고 있는 목록에서 확인하고, 목록에 있다면 CA 공개키로 인증서 복호화
- 클-서 각각의 랜덤 데이터를 조합하여 pre master secret 값 생성(데이터 송수신 시 대칭키 암호화에 사용할 키)
- pre master secret 값을 공개키 방식으로 서버 전달(공개키는 서버로부터 받은 인증서에 포함)
- 일련의 과정을 거쳐 session key 생성
1.4. Server 인증 확인
- 서버는 비공개키로 복호화하여 pre master secret 값 취득(대칭키 공유 완료)
- 일련의 과정을 거쳐 session key 생성
1.5. Handshaking 종료
-
데이터 전송
- 서버와 클라이언트는 session key를 활용해 데이터를 암복호화하여 데이터 송수신
-
연결 종료 및 session key 폐기
🧚♀️ real world
공개키 암호 방식은 알고리즘 계산 방식이 느린 경향이 있으므로 위처럼 공개키와 대칭키방식을 혼합하여 사용한다.
- 안전한 의사소통 채널을 수립할 때는 공개키 암호화 방식을 사용
- 위를 통해 수립된 대화채널에서는 조금 더 빠른 소통을 위해 무작위 대칭키를 생성하여 전반적으로 빠른 대칭키 암호화 방식을 통한 소통을 이룬다.
- 실제 데이터 암호화 방식: 대칭키
- 상기 대칭키를 서로 공유하기 위한 암호화 방식: 공개키
🧚♀️ 출처