요약
- 웹 브라우저가 호스트명을 추출 후 DNS(애플리케이션 계층)에 IP 주소를 물어본다 (DNS query)
- 해당 주소와 TCP 연결 후 SSL/TLS 연결
- HTTP 메시지 생성 후 SSL/TLS 암호화, TCP 포트번호(전송 계층)와 IP 주소(네트워크 계층)를 추가
- 랜카드(물리 계층)를 통해 전송, 이 때 스위치(데이터 링크 계층)와 라우터(네트워크 계층)를 통해 목적지로 메시지가 전달
- 통신이 끝난 후 4-way handshake을 통해 연결을 종료
지난 게시글에 네트워크 보안 수업을 들으면서 공부했던 내용을 더 추가했다
과정 설명
1) 웹 브라우저에 주소를 입력한다
웹 브라우저는 URL에서 도메인을 추출한다
https://www.naver.com -> www.naver.com
도메인만 가지고는 어느 곳에서 데이터를 가져와야 하는지 알 수 없다
따라서 DNS에 도메인을 전송하고 IP주소를 받아온다
2) TCP 연결
TCP는 연결지향성 프로토콜이다
따라서 클라이언트와 서버 간의 연결을 해야 통신을 할 수 있다
이 때 사용되는 방법은 3 HandShaking이다
3) SSL/TCL 연결
아까 입력한 주소는 http://가 아닌 https://로 시작한다
http 프로토콜은 암호화하지 않고 데이터를 보내지만 https 프로토콜은 인증을 하는 절차가 있기 때문에 보안이 뛰어나다
(또한 구글 검색 순위에 영향을 미치기 때문에 자신이 만든 웹 사이트를 서비스 할 때 SEO 측면에서도 좋다)
다음은 연결하는 과정이다
우선 CA(Certificate Authority)라는 것이 등장한다
CA는 인증서를 발급하는 공인된 제 3자 기관이다
SSL/TLS를 위한 인증서를 발급하며 관리해 인터넷 상의 보안을 유지하는 역할을 한다
클라이언트는 CA에서 CA의 공개키를 받아오며
서버는 (사이트 정보 + 사이트 공개키)를 CA에게 보낸 후, 이를 CA가 개인키로 암호화 한 SSL 인증서를 받아온 상태에서 시작한다
- 클라이언트는 서버에게 TLS 버전 + 암호화 알고리즘 + 랜덤데이터 을 보낸다
- 서버는 TLS 버전을 확인하고 클라이언트가 준 암호화 알고리즘 중 하나를 선택한다
- 서버는 CA에서 받아온 SSL 인증서 + 랜덤데이터를 클라이언트에게 보낸다
- 클라이언트는 인증서를 CA에서 받아온 공개키로 복호화 한다 (복호화가 됐다는 것은 서버가 보낸 데이터가 인증 됐다는 의미)
- 클라이언트는 클라이언트의 랜덤데이터 + 서버의 랜덤데이터를 통해 pre master secret이라는 값을 생성한다
- 클라이언트는 pre master secret을 인증서 안에 들어있던 서버의 공개키로 암호화 후 서버로 보내며 서버는 서버의 개인키로 복호화한다
- 자, 그러면 클라이언트와 서버는 서로 pre master secret이라는 값을 안전하게 주고 받았다!!!!!
- 이 값을 통해 master secret값으로 만들고 이를 통해 session key를 생성해 안전한 대칭키로 이용하며 앞으로 통신할 때 데이터를 대칭키로 암호화, 복호화 해서 이용한다
4) HTTP 통신 시작
자, 이제 연결도 잘 됐고 보안 문제도 어느정도 해결됐다
그럼 이제 HTTP 프로토콜을 이용해 서버와 클라이언트간의 통신을 시작한다
- HTTP(애플리케이션 계층) 메시지를 생성한다
- 아까 생성한 대칭키를 통해 SSL/TLS 암호화를 한다 (애플리케이션 계층과 전송 계층 사이)
- 암호화된 데이터에 TCP 포트번호(전송 계층)와 IP 주소(네트워크 계층)를 추가한다
- 랜카드(물리 계층)를 통해 전송되며, 이 때 스위치(데이터 링크 계층, L3 스위치를 쓸 경우 라우터 기능까지 포함)와 라우터(네트워크 계층)를 통해 서버로 메시지가 전달한다
5) 통신 종료
통신이 끝난 후 4-way handshake을 통해 연결을 종료한다
참고
핸드셰이킹 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 핸드셰이크는 본래 악수를 뜻합니다. 핸드셰이킹(handshaking), 주고받기[1]는 정보기술과 전기통신 및 관련 분야에서 채널에 대한 정상적인 통신이 시작되기 전에
ko.wikipedia.org
HTTPS와 SSL 인증서 - 생활코딩
HTTPS VS HTTP HTTP는 Hypertext Transfer Protocol의 약자다. 즉 Hypertext 인 HTML을 전송하기 위한 통신규약을 의미한다. HTTPS에서 마지막의 S는 Over Secure Socket Layer의 약자로 Secure라는 말을 통해서 알 수 있듯이
opentutorials.org