본문 바로가기
네트워크

[브라우저에 URL 입력 후 일어나는 일들] 1_URL을 해석한다.

by 이농이능 2019. 1. 4.


브라우져에서 wangin9.tistory.com 입력 후 일어나는 첫번째 과정!

브라우저에서 'URL 입력 후 해석하는 과정 ' 입니다. 

(본 포스팅은 참고 : https://github.com/SantonyChoi/what-happens-when-KR 에서 정리된 부분을 설명합니다.)




1. "enter" 키 클릭,


(windows)


HID 트랜스포트는 키 눌림 이벤트를 HID가 사용하는 형태의 스캔코드로 변환하는 KDBHID.sys 드라이버에 전달한다.  이 경우 스캔코드는 VK_RETURN 이 된다.


키보드로부터 문자를 입력 받으려면 WM_CHAR 메시지를 사용해야하지만 문자 이외의 키, 커서 이동키, 엔터, Ins 등의 키는 문자키가 아니기 때문에 WM_KEYDOWN 메시지를 사용해야 한다.


가상키 코드
VK_BACK08Backspace
VK_TAB09Tab
VK_RETURN0DEnter
VK_SHIFT10Shift
VK_CONTROL11Ctrl
VK_MENU12Alt
VK_PAUSE13Pause
VK_CAPITAL14Caps Lock
VK_ESCAPE1BEsc
VK_SPACE20스페이스
VK_PRIOR21PgUp
VK_NEXT22PgDn
VK_END23End
VK_HOME24Home
VK_LEFT25좌측 커서 이동키
VK_UP26위쪽 커서 이동키
이하생략 이하생략


WM_KEYDOWN 메시지가 발생했고 wParam 으로 VK_RETURN 이 전달되면 사용자가 엔터를 누른 것임.


KBDHID.sys 드라이버는 KBDCLASS.sys (키보드 클래스 드라이버)와 접속한다. 이 드라이버는 모든 키보드와 키패드 입력의 안전한 처리 담당.


그리고는 Win32K.sys 호출한다. (커널모드에서 일어남)

Win32K.sys 는 어떤 창이 활성화 돼 있는지 GetForegroundWindow() API 이용해서 알아냄. 이 API는 브라우저 주소창의 윈도우 핸들 제공함.


Windows의 "message pump"는 SendMessage(hwnd, WM_KEYDOWN, VK_RETURN, lParam) 을 호출함.

- SendMessage API는 특정한 창 핸들 (hwnd) 의 큐에 메시지 추가하는 함수. hwnd 에 할당된 주 메시지 처리 함수가 큐에 있는 메시지 처리하기 위해 호출.

- lParam : 키 눌림의 자세한 정보 가리키는 비트마스크. 반복횟수, 특수키(alt,shift, ctrl) 가 함께 눌렸는지 상태 정보 담고 있음.


일련의 과정을 통해 활성화된 창은(hwnd) 실제로 편집을 제어하여 WM_KEYDOWN 메시지에 대한 메시지 핸들러 갖게 됨. 사용자가 엔터키 쳤다는 것 알려줌.





(OS X) 


인터럽트 신호는 I/O Kit kext 키보드 드라이버에 인터럽트 이벤트 발생.

이 드라이버는 해당 신호를 OS XWindowServer 프로세스에 전달되는 키 코드로 변환.

그 결과 WindowServer 는 어떠한 적절한 곳에라도 이벤트 큐가 들어있는 Mach의 포트 통해 이벤트 전달.

이벤트는 이 큐에서 mach_ipc_dispatch 함수를 호출할 수 있는 권한을 가진 스레드에 읽힘. 

일련의 과정은 NSApplication 메인 이벤트 루프에 의해서 NSEventTypeKeydown 이라는 NSEvent 통해 처리.





2. 브라우저는 URL을 파싱한다. (MDN web docs)


URL (Uniform Resource Locator) 이란?

URL은 웹에서 정해진 자원의 주소. 각각의 유일한 URL은 유일한 자원을 가리킨다. 


URL 구조


http://www.example.com :80 /path/to/myfile.html ?key1=value1&key2=value2 #SomewhereInTheDocument


2-1) http: 프로토콜

'하이퍼 텍스트 전송 규약'을 사용하라는 뜻.

http는 HTML 같은 문서를 웹 브라우저가 웹 서버에 요청하는 프로토콜이다.

프로토콜은 컴퓨터 네트워크에서 데이터를 교환하거나 전송하기 위한 방법들의 집합.

보통은 http: 와 https: 프로토콜을 사용.


* https : http와 거의 같지만 통신 내용을 암호화한다. 

s : secure socket 을 뜻함.

‘SSL 인증서 사용.

클라이언트와 서버간의 HTTPS 통신에 사용되는 전자 문서로 클라이언트는 서버에 접속한 직후 서버로부터 이 인증서를 내려받아 검증(=서버를 신뢰할 수 있는지 판단한 후 통신 이어감.


인증서에는 서버의 공개키가 담김. 이 인증서는 CA의 개인키로 암호화됨.

브라우저 모든 CA들의 공개키 가지고 있어서 인증서를 복호화하고 내용을 볼 수 있음.

인증서에 들어있는 서버의 공개키 (공개키 방식)


서버/클라이언트 양측 모두 pre master secret를 가지고 이 값은 master secret으로 변환되어 최종적으로 session key가 만들어짐. 서버와 클라이언트는 실제 데이터 전송 시 이 session key를 사용해서 암호화/복호화를 한다. (대칭키)

  

그 이외,

mailto:  메일 클라이언트 열기 위한 규약

ftp: 파일 전송하기 위한 규약


2-2) www.example.com  ( 도메인 이름 )

어떤 웹 서버가 요구되는지 가리킴. 직접 IP address 사용하는 것도 가능하지만 덜 편리하기 때문에 웹에서 주료 사용되지 않음. 


2-3) :80   (포트)

:80 은 포트임. 기술적으로 웹서버에서 자원을 접근하기 위해 사용하는 gate 가리킴.

웹서버가 자원에 접근하기 위해 표준 HTTP 포트( http는 80, https는 443) 사용하면 포트 번호는 보통 생략한다.


2-4) /path/to/myfile.html 

웹 서버에서 자원에 대한 경로.

초기 웹에서는 웹서버상에서 물리적 파일 위치를 나타냄.

요즘은 실제 물리적 경로가 아닌 웹 서버에서 추상화하여 보여줌.


2-5) ?key1=value1&key2=value2  

웹 서버에 제공되는 추가 파라미터.

& 기호로 구분된 키/값으로 짝을 이룬 리스트.


2-6) #SomewhereInTheDocument  

자원 자체에 다른 부분에 대한 anchor(닻)  

일종의 "bookmark".

북마크된 지점에 위치한 내용을 보여주기 위해 브라우저에게 방향을 알려줌.

fragment identifier(부분 식별자) 라고 해서 요청이 서버에 보내지지 않는다.



3. 유니코드 문자열 변환 


브라우저는 호스트명에서 ASCII 아닌 유니코드 문자열 변환한다.

한글을 비롯한 유니코드가 있을 때 브라우저가 URL에서 호스트명 부분에 퓨니코드 인코딩을 한다. 


** 퓨니코드 : 도메인 이름에 쓸 수 있는 문자만으로 다른 유니코드 문자를 표기하기 위해 만들어진 인코딩 방식. 가끔 한글을 url에서 표시할 때 %ED%93% 이런 것을 본적있을 것임.





그 이후 DNS 검색과 ARP 프로세스를 통해 목적지의 IP 와 MAC 주소를 알아내는 방식은 다음 포스트에서 다루겠습니다.!