-
URI에 네이버를 입력하면 발생하는 일CS 2024. 6. 15. 20:42728x90
0. HTTP, URI
HTTP(Hypertext Transfer Protocol )
HyperText인 HTML을 전송하기 위한 통신 규약
- 프로토콜 : 컴퓨터 사이에서 데이터를 교환하는 방식을 정한 규칙 체계
특징
- Connectionless 프로토콜(비연결 지향) 클라이언트가 서버에 요청(Request)했을 때 해당 요청에 맞는 응답(Response)를 보낸 후 연결을 끊는 처리방식
- Stateless(스테이트리스) 프로토콜 커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성 존재
"서버가 클라이언트의 상태를 보존하지 않는다."는 의미는 HTTP 통신을 하면 사용자가 로그인을 한 후 마이페이지로 넘어가면 로그인이 해제된다는 의미입니다. 이를 해결할 방법은 쿠키, 세션, 토큰이 있습니다.
즉 HTTP 프로토콜은 클라이언트가 요청을 하면 서버는 응답을 보내고, 이후 바로 연결을 끊으며, 클라이언트의 상태를 저장하지 않습니다.
URI
URI, 통합 자원 식별자(Uniform Resource Identifier)는 인터넷에 있는 자원을 어디에 있는지 자원 자체를 식별하는 방법입니다.
URI의 하위개념으로 URL, URN 이 있습니다.
- Uniform : 리소스 식별하는 통일된 방식
- Resource : 자원, URI로 식별할 수 있는 모든 것
- Identifier : 다른 항목과 구분하는데 필요한 정보
- URL(Uniform Resource Locator) : 리소스가 있는 위치 지정
- URN(Uniform Resource Name) : 리소스에 이름 부여
URN 이름만으로 실제 리소스를 찾을 수 있는 방법이 보편화 되지 않기에, URN은 거의 사용하지 않습니다. 따라서 여기에서는 URI를 URL과 같은 의미로 사용하겠습니다.
URL의 문법에 대해 알아보겠습니다.
https://www.google.com:443/search?q=hello&hl=ko
- 프로토콜(https)
- 호스트명(www.google.com)
- 포트 번호(443)
- 쿼리 파라미터(q=hello&hl=ko)
으로 되어있는데, 하나씩 살펴보겠습니다.
https://www.google.com:443/search?q=hello&hl=ko
scheme
- 주로 프로토콜 사용
- http는 80 포트, https는 443 포트를 주로 사용, 포트는 생략 가능
- https는 http에 보안 추가 (HTTP Secure)
https://www.google.com:443/search?q=hello&hl=ko
host
- 호스트명
- 도메인명 또는 IP 주소를 직접 사용가능
https://www.google.com:443/search?q=hello&hl=ko
port
- 포트(PORT)
- 접속 포트
- 일반적으로 생략, 생략시 http는 80, https는 443
https://www.google.com:443/search?q=hello&hl=ko
path
- 리소스 경로(path), 계층적 구조
https://www.google.com:443/search?q=hello&hl=ko
query
- key=value 형태
- ?로 시작, &로 추가 가능
- ?keyA=valueA&keyB=valueB
- query parameter, query string 등으로 불림, 웹서버에 제공하는 파라미터, 문자 형태
1. IP주소를 얻기 위해 DNS에 요청
인터넷 망에서 통신하기 위해서 네이버의 IP 주소를 알아야 합니다.
저희는 지금 컴퓨터를 사용하고 있고, 컴퓨터에 연결된 인터넷으로 네이버를 검색, 즉 입력합니다.
인터넷에 연결되어 있는 모든 컴퓨터는 IP라는 인터넷 주소를 가지고 있으며, IP주소를 할당받아야 한다.
그렇다면 네이버라는 서비스를 제공하고 있는 컴퓨터, 서버의 ip도 알아야합니다. 네이버의 주소인 (www.naver.com)는 도메인 네임으로 되어있기 때문에 DNS에 도메인을 검색하기 위한, 즉 네이버의 ip 주소를 알아내기 위한 요청을 보냅니다.
DNS
DNS는 도메인을 IP주소로 변환해서 안내해주는 시스템입니다. 전화번호부라고 할 수 있죠.
아까 컴퓨터는 IP를 할당받는다, 즉 가지고 있어야 하는데 매번 우리가 IP로 입력해서 서비스를 접속하려면 기억하기도 힘들고 어렵습니다. 따라서 이런 DNS를 이용하여 편하게 이용할 수 있습니다. 즉, ip주소가 기억하기 어렵다는 점과 변경될 수 있다는 점을 둘 다 해결해주는 것이 DNS입니다.
DNS 레코드를 이용해 DNS에서 받은 요청을 처리할 수 있습니다.
DNS 레코드 중 여러가지 종류 중 A, AAA, CNAME 레코드를 다뤄보겠습니다.
A 레코드
- IP주소와 도메인 주소를 매핑할 때 사용하는 레코드로써 하나의 도메인에 여러 개의 IP 주소를 등록하는 레코드
AAAA 레코드
- A의 확장형으로 도메인에 IPv6주소가 매핑되어 있는 레코드
- IPv4 32비트의 IP주소입니다. IP 주소는 공인 IP, 사설 IP 주소로 구분되며, 공인 IP 주소는 ISP(인터넷 서비스 제공업체)가 제공합니다.약 43억개의 IP 주소를 제공할 수 있습니다. 하지만 인터넷 환경이 발달함에 따라 어마어마하게 많은 수의 IP주소가 필요해져 IPv4 주소 체계로는 IP주소를 할당하기가 어려워졌습니다. 따라서 새로운 주소 체계인 IPv6가 나오게 되었습니다.
- 이진수로 구성, 8 비트 크기의 필드 4개를 모아서 구성한 32비트 논리주소입니다.
- IPv6암호화와 인증 옵션 기능 등 향상된 보안환경을 제공합니다.
- IPv4에 사용하지 않는 주소가 많은데 필요한 주소도 많아서 IP 주소가 부족하게 되어 IPv6이 등장하게 되었습니다. 128비트로 구성, 16비트씩 :으로 나누어 각 필드를 16진수로 표현하는 방법을 사용합니다.
CNAME 레코드
- 도메인 별명 레코드라고 부르며 Alias라고 하여 기존 도메인에 별명을 붙인 레코드입니다.
2. DNS는 일련의 과정을 거친 후 (www.naver.com)에 대응하는 ip주소를 응답으로 반환
DNS는 복잡하고 매우 빨라야 하기 때문에 DNS 데이터는 웹 브라우저 사이의 서로 다른 계층과 인터넷의 다양한 위치에 임시로 저장됩니다.
이를 캐시(Cache)라고 부르는데, 웹 브라우저는 고유한 캐시, 운영 체제 캐시, 라우터의 로컬 네트워크 캐시, 회사 네트워크 또는 인터넷 서비스 제공업체(ISP)의 DNS 서버 캐시를 확인합니다.
이제 네이버의 ip를 받았습니다.
3. TCP통신을 통해 해당 ip서버에 요청
IP
IP(Internet Protocol)는 인터넷을 통해 데이터를 주고받을 때 사용되는 통신 규약입니다.
IP는 프로토콜 그 자체이고 IP주소는 IP통신을 하기 위해 각 기기들을 구분하는 고유번호라고 이해하면 됩니다.
- 역할
- 지정한 IP 주소(IP Address)에 데이터 전달
- 패킷(Packet)이라는 통신 단위로 데이터 전달
IP만 사용했을 시에 아래와 같은 문제점이 존재합니다.
1. 비연결성 : 패킷을 받을 대상이 없거나 대상 서버가 서비스 불능 상태여도 패킷을 전송합니다.
2. 비신뢰성 : 패킷이 사라지거나 순서대로 오지 않는다는 문제가 발생해도 서버에서는 알 수가 없습니다.
3. 프로그램 구분 불가
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이라면?
- 서버를 이용해 실행하는 프로그램이므로 각각 포트가 있습니다.
- IP는 포트가 없으므로 유저가 음악을 들으면서 게임도 하고 인터넷 검색도 하고 있다면 IP로는 클라이언트가 전송하는 데이터를 구분할 수 없게 됩니다.
이걸 해결하는 것이 TCP/UDP입니다.
TCP
TCP(Transmission Control Protocol)는 전송 제어 프로토콜입니다.
- 연결지향 : TCP 3 way handshake 실제로 연결된게 아니라 개념적으로 연결된 것을 의미
- 데이터 전달 보증
- 순서 보장
⇒ 따라서 TCP를 신뢰할 수 있는 프로토콜이라고도 합니다.
UDP
UDP(User Datagram Protocol)는 사용자 데이터그램 프로토콜입니다.
데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠릅니다.
- ip와 거의 같고 PORT, 체크섬 추가
- port를 전송하므로 하나의 ip에서 여러 프로그램 구분 가능
- 체크섬 : 네트워크를 통해서 전송된 데이터의 값이 변경되었는지(무결성)를 검사하는 값 결성을 통해서 네트워크를 통해서 수신된 데이터에 오류가 없는지 여부를 확인
TCP 통신을 통해 받은 해당 ip 서버에 요청을 보냅니다.
요청을 보내기 위해서는 프로토콜 스택을 통해 높은 계층에서 낮은 계층으로 가며 변환됩니다.
응용 계층에서 보내는 HTTP 메시지에 전송계층의 TCP/UDP가 한번 감싸고, 네트워크 계층의 IP가 감싸며 캡슐화를 진행하고, 상대의 IP주소, 포트번호, 오류유무, 전송시간 등 부가정보가 붙게 됩니다.
이후 역캡슐화를 통해 메시지가 해체되면서 서버에 전달됩니다.
4. 웹 브라우저와의 TCP 연결 성공 시 HTTP Request 요청
인터넷에 연결된 웹 브라우저 요청 패킷은 일반적으로 TCP/IP(Transmission Control Protocol/Internet Protocol)라고 하는 전송 제어 프로토콜을 사용하여 웹 서버를 찾습니다.
웹 브라우저가 인터넷에서 서버를 찾으면 웹 서버와 TCP 연결을 설정하고, HTTP를 통해 평문 통신을 시작합니다.
그러나, HTTPS를 사용하는 경우 주고 받는 데이터의 암호화를 위한 TLS (Transport Layer Security) 핸드셰이크라는 추가 과정을 수행합니다.
TLS 핸드세이킹에 대해 알기 위해 암호화, 인증서에 대해 알아보겠습니다.
HTTPS
HTTP는 암호화되지 않은 방법으로 데이터를 전송하기 때문에 서버와 클라이언트가 주고 받는 메시지를 감청하는 것이 매우 쉽습니다.
예를들어 로그인을 위해서 서버로 비밀번호를 전송하거나, 또는 중요한 기밀 문서를 열람하는 과정에서 악의적인 감청이나 데이터의 변조등이 일어날 수 있습니다. 이를 보안한 것이 HTTPS입니다.
HTTPS는 SSL(Secure Soket Layer) 프로토콜을 사용하는 프로토콜입니다. SSL 암호화 통신이란 SSL/TLS이라는 보안 프로토콜을 통해 클라이언트와 서버가 보안이 향상된 통신을 하는 것입니다.
*대칭키, 공개키 암호화 : https://suhyeon3484.tistory.com/entry/%EC%95%94%ED%98%B8%ED%99%94-%EB%B0%A9%EC%8B%9D%EB%8C%80%EC%B9%AD%ED%82%A4-%EA%B3%B5%EA%B0%9C%ED%82%A4
SSL 인증서
클라이언트와 서버 간 통신을 제 3자가 보증해주는 전자화 된 문서입니다.
클라이언트가 서버에 접속한 직후 서버는 클라이언트에게 이 인증서 정보를 전달합니다.
클라이언트는 이 인증서 정보가 신뢰할 수 있는 것인지를 검증 한 후 절차를 수행합니다.
서버가 클라이언트에게 인증서를 전달하는데, 이 인증서에 공개키가 포함되어 있어 해당 공개키를 통해 추후에 서버와 통신을 할때 암호화와 복호화를 할 수 있습니다.
장점
- 통신 내용이 공격자에게 노출되는 걸 막음
- 클라이언트가 접속한 서버가 신뢰할 수 있는 서버인지 판단
- 통신 내용의 악의적인 변경 방지
인증서는 클라이언트가 접속한 서버가 클라이언트가 의도한 서버임을 보장합니다.
이런 역할을 하는 기업을 CA라고 합니다.
SSL을 통해서 암호화된 통신을 제공하려는 서비스(https)는 CA를 통해서 인증서를 구입해야 합니다.
- 서비스의 정보(인증서를 발급한 CA, 서비스의 도메인 등등) : 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지에 대한 내용
- 서버 측 공개키(공개키의 내용, 공개키의 암호화 방법) : 서버와 통신을 할 때 사용할 공개키와 그 공개키의 암호화 방법들의 정보
⇒ CA에 의해 암호화되는데 이 때 사용하는 방법이 공개키 방식
따라서 CA는 자신의 CA 비공개키를 이용해서 서버가 제출한 인증서를 암호화하는 것이므로 CA의 비공개키는 절대로 유출되면 안됩니다.
- 브라우저가 서버에 접속할 때 서버가 인증서 제공
- 브라우저는 인증서를 발급한 CA가 자신이 내장한 CA의 리스트에 있는지 확인
- 서버를 통해 다운한 인증서가 내장된 CA 리스트에 포함이 되어있다면
- 해당 CA 공개키를 이용해 인증서 복호화
- = 해당 인증서가 CA의 비공개키에 의해서 암호화 된 것 의미
- 서버를 통해 다운한 인증서가 내장된 CA 리스트에 포함이 되어있다면
- CA에 의해서 발급된 인증서 = 접속한 사이트가 CA에 의해서 검토되었다.
- = 해당 서비스는 신뢰가능하다.
정리하면 아래 그림과 같습니다.
SSL 동작 방법
SSL은 80번 포트를 사용하는 http와는 달리 443번 포트를 기본으로 사용하는 TCP 기반의 프로토콜입니다.
참고로, TCP 기반이기 때문에 SSL 핸드셰이크 전에 TCP 3-way handshake도 수행합니다.
이후 암호화해서 데이터를 전송하는데, 핸드쉐이크 - 세션(전송) - 세션 종료 단계를 거쳐 SSL에서 통신을 합니다.
SSL은 암호화된 데이터를 전송하기 위해서 공개키와 대칭키를 혼합해서 사용합니다. 즉 클라이언트와 서버가 주고 받는 실제 정보는 대칭키 방식으로 암호화하고, 대칭키 방식으로 암호화된 실제 정보를 복호화할 때사용할 대칭키는 공개키 방식으로 암호화해서 클라이언트와 서버가 주고 받습니다.
아래 그림과 같은 TLS (Transport Layer Security) handshaking 과정을 통해 TCP 연결을 완료합니다.
TCP 연결 성공 시 HTTP requeset를 보냅니다.
5. 브라우저는 받은 Response로 Naver 화면 렌더링
정리
URI에 “네이버”라고 입력했을 때 발생하는 과정을 정리하면 다음과 같습니다.
- IP주소를 얻기 위해 DNS에 요청
- DNS는 일련의 과정을 거친 후 (www.naver.com)에 대응하는 ip주소를 응답으로 반환
- TCP통신을 통해 해당 ip서버에 요청
- 웹 브라우저와의 TCP 연결 성공 시 HTTP Request 요청
- 브라우저는 받은 Response로 Naver 화면 렌더링
REF
https://opentutorials.org/course/228/4894
https://www.inflearn.com/course/lecture?courseSlug=탄탄한-백엔드-네스트&unitId=86990
https://nomadcoders.co/noom/lectures/3088
https://dev-coco.tistory.com/61
https://www.youtube.com/watch?v=gA1KsJ2ak10
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
[책] 웹을 지탱하는 기술
[책] 네트워크 개론
https://chiefcoder.tistory.com/42
https://m.blog.naver.com/tkdldjs35/221977544533
https://yozm.wishket.com/magazine/detail/1852/
https://velog.io/@averycode/HTTPS-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%B3%B4%EC%95%88
https://velog.io/@judel/Computer-Netowrk-SSL-%EC%9D%B8%EC%A6%9D%EC%84%9CFeat.-TLS
https://emhaki.tistory.com/entry/IPv4%EC%99%80-IPv6
https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-URL-URI-%EC%B0%A8%EC%9D%B4
728x90'CS' 카테고리의 다른 글
암호화 방식(대칭키, 공개키) (0) 2024.05.27 [CS] CDN(Contents Delivery Network) (0) 2023.04.17 [CS] Blocking, Non-Blocking, Sync, Async (0) 2023.01.11 [CS] 가상메모리 (1) 2023.01.06 [CS] MVC (0) 2022.12.28