본문 바로가기

Programming/Web_development

Web 기본 지식

웹이란 무엇인가?


웹 해킹을 포함한 다양한 분야에서의 해킹은 본래의 의도와는 다른 행위를 발생시키는 것을 의미한다.

이러한 의도치 않은 행위를 발생시키기 위해서는 설계 또는 운영의 약점을 찾을 수 있어야 한다.

물론 이를 위해서는 해당 시스템에 대한 설게자 또는 운영자보다 더 높은 이해도를 가지고 있어야 한다.

인터넷상의 서비스 중 HTTP를 이용하여 정보를 공유하는 통신 서비스를 웹, 서비스를 제공하는 대상을 웹 서버,
서비스를 받는 사용자를 웹 클라이언트 라고 부른다.

초기 웹은 저장된 문서의 내용을 출력해 사용자에게 제공하는 간단한 서비스였다. 이것이 시간이 지남에 따라 발전하고 적응하며 사용자의 입력과 입력에 따른 기능 수행이 추가되고 업무, 금융, 쇼핑 등 다양한 분야에서 사용할 수 있도록 발전해왔다.

과거에는 오프라인으로 진행되거나 물리적으로 저장되었던 정보들이 웹에서 접근 가능한 디지털 정보를 바뀌었다.

개인정보(이름, 전화번호, 주소, 카드번호 등) 및 기업의 자산 등이 웹에서 접근 가능해짐에 따라 웹 보안의 중요성 또한 나날이 강조되고 있다.

웹 기초 지식


Web Browser

  • 웹에 접속하기 위해 사용하는 소프트웨어

Web Resource

  • 웹 상에 존재하는 모든 컨텐츠(HTML, CSS, JS, PDF, PNG 등)

URI(URL)

  • URI는 Uniform Resource Identifier의 약자로 리소스를 식별하기 위한 식별자이다.

HTTP(HyperText Transfer Protocol

  • 인터넷 서비스에서 서비스 대상 간 통신규약을 지정하여 통신한다.
  • HTTP는 웹을 이용하기 위한 통신 규약이다.

HTTPS(HyperText Transfer Protocol)

  • 기존 HTTP 데이터를 암호화하여 통신하는 프로토콜

Cookie

  • 웹 브라우저에 저장하는 데이터, 클라이언트의 리소스를 사용한다.

Session

  • 서버에 저장하는 데이터, 서버의 리소스를 사용한다.

Server

  • 서버는 인터넷상에서 사용자에게 서비스를 제공하는 컴퓨터이다, 그 중 웹 서버는 사용자(클라이언트)와 HTTP를 이용하여 통신하는 서버이다.

Application

  • 서버에서 설정한 특정 기능들을 수행하는 소프트웨어이다.

DataBase

  • 데이터를 저장하기 위해 사용하는 데이터 저장소

Web Browser


우리는 문서를 편집하기 위해 한컴 한글 소프트웨어를 사용하고, 스프레드시트 작업을 위해 엑셀 소프트웨어를 사용한다.

이와 마찬가지로 웹을 사용하기 위해 웹 브라우저를 사용한다. 웹 브라우저는 HTTP를 통해 인터넷상에서 통신을 하며 서버로부터 전달받은 다양한 웹 리소스들을 가공해 사용자가 웹과 HTTP의 동작 원리를 알지 못해도 웹을 사용할 수 있도록 도와주는 소프트웨어이다.

오늘날에는 다양한 브라우저가 존재하며 이들이 수행하는 기본적인 기능은 동일하지만 HTML/CSS/JS 로딩을 빠르게 하거나 내장 로그인을 통해 브라우저를 사용하는 모든 디바이스 동기화 기능 등에 차별화를 두고있다.

Web Resource


웹 리소스는 웹에서 사용하는 컨텐츠를 의미한다. 예를들어, https://github.com/yeojaeng 주소를 입력하게 되면
github.com에 존재하는 /yeojaeng 리소스에 대해 요청을 수행하는 것을 의미한다.

초기 웹에서는 실제 서버 내 존재하는 파일의 실제 위치를 의미하였지만 최근 웹에서는 실제 위치가 아닌 웹 서버에 의해 추상화된 경로의 개념으로도 사용된다.

사용자가 웹 브라우저를 통해 보게 되는 페이지를 구성하는 대표적 웹 리소스들은 아래와 같다.

  • HTML (Hyper Text Markup Language)
    • 웹 문서의 뼈대를 구축하기 위한 마크업 언어이다.
    • 정해진 태그와 속성을 지정하여 문서를 구성한다.
  • CSS (Cascading Style Sheets)
    • HTML이 표시되는 방법을 정의하는 스타일 시트 언어이다.
    • 이미지, 태그, 글자 등 다양한 웹 리소스들의 출력 시 스타일을 설정한다.
  • JS (JavaScript)
    • HTML과 CSS는 화면에 출력되는 뼈대를 그리는 것이며, JS와 같은 Client Side Script를 이용하여 페이지 내에서의 동적인 행위들을 설정할 수 있다.

Encoding


Encoding(인코딩)은 문자 또는 기호 등의 정보, 형태를 표준화, 보안 등의 목적으로 다른 형태나 형식으로 변환하는 처리 혹은 그러한 처리 방식을 의미한다. 다시 원래 형태로 변경하는 것을 Decoding(디코딩)이라고 한다.

Encoding : 알고리즘이 모두 공개되어 있으며 키와 같은 요소가 포함되어 있지 않아 모두가 원래의 정보로 복원이 가능하다.

Encryption : 양방향 암호 알고리즘이다, 일치한 알고리즘과 유효한 키를 가지고 있다면 원래의 정보로 복원이 가능하다.

Web에서 사용하느 대표적인 인코딩은 URLHTML Entity가 있다.

URL Encoding

  • URI 구조 내에서 예약어(구분자)로 사용되는 문자들을 전송하고자 할 때 사용한다. 구분자들은 URI 구조내에서 문법적으로 중요한 의미를 가지고 있기 때문에 문법적으로 사용되지 않을 경우에는 반드시 인코딩되어 사용되어야 한다.

GET 메소드로 a=?b, c=&d라는 데이터를 전달하기 위해서는,

http://exmaple.com/?a=%3Fb&c=%26d의 형태로 전송이 되어야 서버에서도 정상적으로 데이터를 해석하여 처리할 수 있다.

  • URL 인코딩 방식은 입력된 문자를 ASCII테이블에서 매칭되는 Hex값에 %를 붙이면 된다.
  • ? -> %3F , # -> %23 , & -> %26 ...etc

HTML entity Encoding

  • HTML 문서 내에서 사용되는 문자열들이 HTML에서 사용하는 태그들의 문자로 인식되지 않도록 하기 위해 사용한다.

HTTP (HyperText Transfer Protocol)


웹 브라우저를 사용할 때 주소창에서 HTTP 또는 HTTPS라는 글자를 확인할 수 있다.

HTTP 또는 HTTPS는 URI에서 Scheme (Protocol)에 해당된다.

Protocol은 컴퓨터 내부 혹은 컴퓨터 간 어떻게 데이터가 교환되는지 정의하는 규칙 체게이다.

즉, https://github.com에서 URI는 HTTPS 방식으로 github.com서버와 통신한다는 의미이다.

HTTPS는 웹에서 이루어지는 통신을 정의한 프로토콜로써, TCP혹은 TLS를 사용해 통신하고 기본 포트로 80(HTTP), 443(HTTPS) 포트를 사용한다.

(위 포트는 관례적으로 사용하는 포트일뿐, 지정포트는 아니다. 서버의 설정을 통해 변경이 가능하다.)

HTTP Request


HTTP Request는 서버에 대한 요청을 의미한다.

클라이언트와 서버가 서로 통신을 하기 위해서는 서로의 언어를 이해할 수 있는 구조로 데이터가 전달되어야 한다.

HTTP의 구조에서 각 줄은 `CRLF(Carriege Return Line Feed)로 줄 바꿈이 이루어져야 한다.

Request의 가장 첫 줄에는 사용자가 서버에 요청시 수행하고자 하는 동작인 method, 요청하는 웹 리소스의 경로인 path, 사용하는 HTTP의 버전을 나타내는 version으로 구성된다.

두번째 줄 부터는 Header부분이며 이는 이름:값의 딕서너리 형태로 이루어진다.

Header는 데이터의 상황에 따라 많은 데이터가 사용될 수 있기 때문에 Header 부분의 끝을 표시하기 위해 CRLF를 두번 출력한다.

Header

  • Host : 데이터를 보내는 서버의 주소를 의미한다.
  • Cookie : 사용자를 식별하기 위해 사용하는 정보이다.
  • User-Agent : 사용자가 사용하는 프로그램의 정보를 나타낸다.
  • Referer : 페이지 이동시 이전 URI의 정보를 나타낸다.
  • Content-Type : 사용자가 전달하는 데이터의 처리 방식과 형식을 나타낸다.

HTTP Response


HTTP Response는 사용자의 요청에 대한 서버의 응답을 의미한다.

Response의 구조도 Request의 구조와 마찬가지로 각 줄은 CRLF로 줄 바꿈이 이루어져야 한다.

HTTP Response의 구조 중 가장 첫 줄에는 Version과 사용자 요청에 대한 서버의 Status Code로 구성된다.

두번쨰 줄 부터는 Header부분으로 각 줄은 Key:Value의 형태로 이루어진다.

또한, Request와 마찬가지로 헤더의 끝을 알리기 위해 CRLF를 두번 출력한 뒤 서버의 응답 데이터 부분인 Body로 구성된다.

웹 해킹에서는 사용자의 입력에 의한 서버의 응답값 (Status Code)를 주의깊게 살펴 볼 필요가 있다.

예를 들어, 악의적인 값을 대입했을 때 500 Status Code(Internal Server Error)가 응답된다면 이는 클라이언트의 입력값이 서버에 어떠한 영향을 끼쳤다고 짐작을 할 수 있으며 이를 바탕으로 취약점이 있음을 가정하여 더욱 주의깊게 살펴볼 수 있게 된다.

Status Code

20x: 사용자의 요청에 대한 서버의 처리가 정상적으로 처리되었음을 의미함.

30x : 사용자가 요청한 리소스가 다른 경로로 변경된 경우를 의미함.

40x : 사용자가 서버에 요청하는 구조 또는 데이터가 잘못되었음을 의미함.

50x : 서비스를 제공하는 서버 내 에러가 생겼음을 의미함.

Cookie


HTTP는 하나의 RequestResponse의 쌍이 독립적으로 구성되어 통신하는 connectionless & stateless 특성의 프로토콜이다.

connectionless : 하나의 요청에 대한 응답을 한 후 네트워크 연결을 끝맺는것을 의미한다.

불특정 다수에게 서비스 되어야하는 웹 서비스 특성상 계속하여 연결상태를 유지하는 것은 서버의 부하로 이어질 위험이 존재하기 때문에 connectionless 특성을 갖게 되었다.

stateless : 네트워크가 연결이 끝맺을 때 상태를 유지하지 않는 것을 의미한다.

HTTP 요청마다 새로운 커넥션을 열기 때문에 사용자 인증을 계속해야 한다는 단점이 있으며 이를 보완하기 위해 Cookie라는 개념이 나왔다.

웹 브라우저는 HTTP ResponseSet-Cookie HEader 또는 Javascript의 document.cookie를 통해 데이터를 쿠키에 저장한다.

Session


쿠키에 인증 상태를 포함한 데이터를 저장하면 사용자가 임의로 사용자로 인증된 것 처럼 요청을 조작할 수 있다.

따라서 서버에 데이터를 저장하기 위해 Session이라는 개념을 사용한다.

세션을 활용하면 데이터를 서버에 저장하고 해당 데이터를 접근할 수 있는 유추할 수 없는 랜덤한 문자열 키를 만들어 응답하며 이를 보통 Session ID라고 부른다.

브라우저는 해당 키를 쿠키에 저장하고 이후 HTTP요청을 보내면 서버에서 해당 키에 해당하는 data를 가져와 인증 상태를 확인한다.

Web Server


웹 서버는 사용자의 HTTP 요청을 해석하여 처리한 후 응답하여 주는 역할을 한다.

대표적으로 nginx, Apache, IIS, Tomcat등이 있다.

웹 서버는 사용자로 부터 받는 요청을 웹 서버 자체적으로 처리할지, 들어온 요청에 알맞은 내부 서비스로 연결을 진행할 지 정할 수 있다.

웹 어플리케이션은 사용자의 요청을 동적으로 처리할 수 있도록 만들어진 어플리케이션이다.

웹 어플리케이션을 작성할 때는 사용자가 요청한 내용을 동적으로 처리하기 위해 웹 어플리케이션 Language가 사용되며 대표적으로 PHP, NodeJS, Python, Java등이 있다.

또한 웹 어플리케이션은 서버에서 동작하기 때문에 웹 어플리케이션 구현체에서 취약점이 발생하게 되면 서버와 직접적으로 연결되어 있어 더 큰 영향을 끼치게 된다.

DBMS


DataBase Managent System은 데이터베이스 내 데이터 조회/수정/삽입 등을 용이하게 사용할 수 있도록 도와주는 서버 어플리케이션이다. MySQL & Ms-SQL등을 DBMS라고 하며 해당 어플리케이션들이 관리하는 데이터를 데이터베이스라고 한다. 개발자는 DB내용을 조회/수정/삽입하기 위해 DBMS를 사용하며 DBMS는 SQL Query를 통해 제어된다.

이때 사용자의 입력값을 SQL Query에 필터링 없이 사용하게 되면 SQL Injection 공격에 노출되게 된다.

'Programming > Web_development' 카테고리의 다른 글

[JSP] Action Tag  (0) 2020.02.16
[JSP] Servlet Lifecycle & JSP 태그와 동작의 이해  (0) 2020.02.14
Servlet & doGet() & doPost() 그리고 MVC 패턴  (0) 2020.02.14
HTML 태그 정리  (0) 2017.11.07