1. Web Hacking Introduction
1-1. Introduction
- 위 강의를 듣기 위해서는 Flask, NodeJS, Spring 중 한가지 프레임워크로 작성된 웹 소스를 읽고 이해할 수 있어야 한다.
2. 웹 기초 지식
2-1. 웹 기본 상식
통신
웹(World Wide Web, W3, Web)
- 인터넷이라는 통신망을 활용하여 구현된 전 지구적 정보 공간. 시간과 장소에 구애받지 않고 인터넷에 접속할 수만 있다면 웹을 사용할 수 있다. (웹은 연결된 사람들 사이에 형성되는 정보의 흐림이 거미줄 같다는 뜻으로 붙여짐.)
- HTTP를 이용하여 정보를 공유하는 서비스.
- HTTP: 웹상에서 서로 통신을 하기 위해 정해둔 일종의 규칙.
- 웹 서버(Web Server): 웹에서 정보를 제공하는 주체.
- 웹 클라이언트(Web Client): 웹에서 정보를 요구하고, 정보를 받는 이용자.
웹서비스
- 웹 상에서 제공되는 서비스
- 과거: 이용자가 요청하는 정보를 제공하기만 하는 수동적인 형태의 서비스.
- 현재: 이용자의 요청을 해석하고 가공하여 필요한 정보와 기능을 제공하는 능동형 서비스.
프론트엔드
- 웹 서비스 구조에서, 이용자의 요청을 받는 부분.
- 이용자에게 직접 보여지는 부분으로 웹 리소스라는 것으로 구성된다. 페이지가 보여주고 있는 정보들은 모두 웹 리소스에 명시되어 있다.
백엔드
웹 리소스
- 웹에 갖춰진 정보 자산.
- 모든 웹 리소스는 고유의 URL(Uniform Resource Identifier)을 가지고, 이를 이용하여 식별된다.
- 대표적인 웹 리소스
- HTML: 웹 문서의 뼈와 살의 역할. 태그와 속성을 통한 구조화된 문서 작성을 지원한다.
- CSS: 웹 문서의 생김새를 지정하는 역할. 웹 리소스들의 시각화 방법(요소들의 색상, 모양, 크기와 위치)을 기재한 스타일 시트. 브라우저는 이를 참고하여 웹 문서를 시각화한다.
- JS: 웹 문서의 동작을 정의. 이용자가 데이터를 입력하면 실행할 동작들을 구현한다. 클라이언트가 실행하는 코드라고 하여 Client-Side Script라고도 부른다.
웹 클라이언트와 서버의 통신
1. 클라이언트인 이용자가 브라우저를 이요하여 웹 서버에 접속
2. 클라이언트의 브라우저는 이용자의 요청을 해석하여 HTTP 형식으로 웹 서버에 리소스를 요청.
3. 서버의 HTTP로 전달된 이용자의 요청을 해석하고, 그에 따라 적절한 동적을 한다.
4. 서버는 이용자에게 전달할 리소스를 HTTP 형식으로 이용자에게 전달한다.
5. 클라이언트의 브라우저는 서버에게 응답받은 웹 리소스를 시각화하여 이용자에게 보여준다.
2-2. HTTP/HTTPS
인코딩 표준
- 컴퓨터에서 0과 1로 문자를 표현하는 약속.
- 아스키(Ascii)와 유니코드(Unicode)가 있다.
- 아스키: 7비트 데이터에 대한 인코딩. 영어를 표현할 때 사용하였는데, 다른 언어를 표현할 때는 호환되지 않아 소프트웨어를 개발하려는 회사에 큰 부담이 되었음. 이러한 어려움을 해결하기 위해 유니코드라는 새로운 표준이 만들어짐.
- 유니코드: 모든 언어의 문자를 표현하고자 하는 목표로 제정됨.
- 유니코드에서 한 문자는 최대 32개의 비트로 표현되기에, 표현할 수 있는 정보의 가짓수는 약 42억개(2^32)이다. 전 세계의 문자를 표현하고도 남을 넓은 공간이기에, 남는 공간에는 이모지들을 표현하고 있음.
통신 프로토콜
- 프로토콜: 규격화된 상호작용(요청과 응답)에 적용되는 약속. 프로토콜은 각 통신 주체가 교환하는 데이터를 명확히 해석할 수 있도록 문법을 포함한다.
- 표준 통신 프로토콜: TCP/IP(네트워크 통신의 기초), HTTP(웹 애플리케이션이 사용), FTP(파일을 주고받을 때 사용)
HTTP
- 서버와 클라이언트의 데이터 교환을 요청과 응답 형식으로 정의한 프로토콜. 기본 메커니즘은 클라이언트가 서버에게 요청하면, 서버가 응답하는 것이다.
- 웹 서버는 HTTP 서버를 HTTP 서비스 포트에 대기시킨다. 일반적으로 TCP/80 또는 TCP/8080 포트를 사용한다.
네트워크 포트와 서비스 포트
- 네트워크 포트: 네트워크에서 서버와 클라이언트가 정보를 교환하는 추상화된 장소.
- 서비스 포트: 네트워크 포트 중에서 특정 서비스가 점유하고 있는 포트. 예를 들어 HTTP가 80번 포트를 점유하고 있으므로 HTTP의 서비스 포트는 80번 포트가 된다.
- 전송계층: 포트로 데이터를 교환할 때 따르는 프로토콜. 대표적으로 TCP와 UDP가 있다. 서로 다른 전송계층은 서로 다른 프로토콜로 전송해야 하므로 서비스 포트를 표기할 때는 서비스가 사용하는 전송 계층 프로토콜을 같이 표기하기도 한다.
- 현대의 운영체제에서 포트의 개수는 0~65545번까지 사용하고 있다.
- 특권 포트(잘 알려진 포트): 0~1023번 포트, 각 포트 번호에 유명한 서비스가 등록되어 있다. 잘 알려진 포트에 서비스를 실행하려면 관리자 권한이 필요하기에 클라이언트는 이 대역에서 실행중인 서비스들은 관리자의 것이라고 신뢰할 수 있다.
- 예시로는 22번 포트에 SSH, 80번 포트에 HTTP, 443번 포트에 HTTPS가 할당되어 있다.
HTTP 메세지
- HTTP 메세지에는 클라이언트가 전송하는 HTTP 요청, 서버가 반환하는 HTTP 응답이 있다. 이들은 크게 헤더와 바디로 구성된다는 공통점이 있다.
HTTP 헤더
- 각 줄은 CRLF로 구분되며, 첫 줄은 시작 줄, 나머지 줄은 헤더라고 부른다. 헤더의 끝은 빈 줄로 나타낸다.
- 시작 줄의 역할은 요청과 응답에서 큰 차이가 있다.
- 헤더는 필드와 값으로 구성되며 HTTP 메세지 또는 바디의 속성을 나타낸다. 하나의 HTTP 메세지에는 0개 이상의 헤더가 있을 수 있다.
HTTP 바디
- 헤드의 끝을 나타내는 CRLF 뒤 모든 줄.
- 클라이언트나 서버에게 전송하려는 데이터가 바디에 담긴다.
CRLF
- CR(Carriage Return): 커서를 현재 줄의 맨 앞으로 이동시키는 문자
- LF(Line Feed): 커서를 다음 줄로 이동시키는 문자.
HTTP 요청