1. 웹이란 무엇인가?
- 웹이란 무엇인가?
웹의 정확한 어원은 월드 와이드 웹(World wide Web)이며, 간단하게 웹이라고 부른다.
웹의 사전적 의미인 거미줄과 같이 인터넷상에서 각각의 사용자가 연결되어 서로 정보를 공유한다는 의미를 가진다.
- 웹(Web) : HTTP를 이용하여 정보를 공유하는 통신 서비스
- 웹 서버(Web Server) : 서비스를 제공하는 대상
- 웹 클라이언트(Web Client) : 서비스를 받는 사용자
2. 웹 기초지식
- Web Browser : 웹에 접속하기 위해 사용하는 소프트웨어
웹을 사용하기 위해선 웹 브라우저를 사용해야 한다. 웹 브라우저는 HTTP를 통해 인터넷 상에서 통신을 하며 서버로부터 전달받은 다양한 웹 리소스(Web Resources)를 가공해 사용자가 웹과 HTTP의 동작 원리를 알지 못해도 웹을 사용할 수 있도록 도와준다.
Chrome, Edge, Safari 등이 대표적인 웹 브라우저이다.
- Web Resource : 웹 상에 존재하는 모든 콘텐츠
웹 브라우저 주소창에 https://dreamhack.io/index.html 을 입력하면 dreakhack.io에 존재하는 /index.html 리소스에 대한 요청을 수행한다.
- URI (URL) : 리소스를 식별하기 위한 식별자
URI보단 URL이 더 친숙한 용어이다.
URI는 Uniform Resource Identifier의 약자이고, URL은 Uniform Resource Locator의 약자로, URL은 리소스의 위치를 식별하기 위한 URI의 하위 개념이다.
URI나 URL을 사용하여 웹 사이트의 주소에 접근할 수 있다. 최근에는 URI와 URL을 혼용하여 사용하는 추세이기 때문에 본문에서는 상위 개념인 URI로 통합하여 설명한다.
다음은 URI의 구성요소이다.
- scheme : 웹 서버에 접속할 때 어떤 체계(프로토콜)을 이용할지에 대한 정보를 담고 있다. 보통 http나 https를 사용한다. 추가로 mailto(메일)나 tel(연락처 프로그램)을 이용하기도 한다.
- host : Authority의 일부로써 접속할 웹 서버의 서버주소에 대한 정보를 가지고 있다.
- port : Authority의 일부. 웹 서버 포트에 대한 정보를 가지고 있다.
- path : 접속할 웹 서버의 경로에 대한 정보를 갖으며 / 문자로 구분된다.
- query : 웹 서버에 전달하는 파라미터 (추가적인 정보) 이며 ? 문자 뒤에 붙는다.
- fragment : 매인 리소스 내에 존재하는 서브 리소스에 접근할 때 이를 식별하기 위한 정보를 담고 있으며, URI에서 # 문자 뒤에 붙는다.
- Encoding
문자 또는 기호 등의 정보, 형태를 표준화, 보안 등의 목적으로 다른 형태나 형식으로 변환하는 처리 혹은 그 처리방식을 말한다.
인코딩된 형태를 원래 상태로 변경하는 것을 Decoding(디코딩)이라고 한다.
웹 상에서의 Encoding은 URL과 HTML Entity가 있다.
- URL Encoding
URL 구조 내에서 예약어로 사용되는 문자들을 전송하고자 할 때 사용한다. 예약어는 URI 구조 내에서 문법적으로 중요한 의미를 가지고 있기 때문에 문법적으로 사용하지 않는 경우에는 반드시 인코딩해야 한다.
예를 들어 아래의 URI를 인코딩한다고 하자
이 URI를 인코딩하면 아래와 같은 결과가 나온다.
디코딩하면 다시 원래 상태로 돌아간다.
- HTML entity Encoding
HTML 문서 내에서 사용하는 문자열들이 HTML에서 사용하는 태그로 인식하지 않도록 하기 우해 사용하는 인코딩 방식이다.
- HTTP : 웹을 이용하기 위한 통신 규약
HyperText Transfer Protocol
HTTP 또는 HTTPS는 URI의 구성 요소 중, Scheme에 해당한다. 이 Scheme는 Protocol로도 불리는데 이는 컴퓨터 내부 혹은 컴퓨터 사이에서 어떻게 데이터를 교환해야 하는지를 정의하는 규칙 체계이다.
https://dreamhack.io이라는 URI는 HTTPS 방식으로 dreamhack.io 서버와 통신한다는 것을 의미한다.
- HTTP Request
HTTP Request는 서버에 대한 요청을 말하낟. client와 server가 서로 통신하기 위해선 서로가 이해할 수 있는 데이터 구조로 전달해야 한다.
HTTP의 구조에서 각각의 줄은 CRLF로 줄 바꿈이 이루어져야 한다.
CRLF란 Carrage Return(CR) Line Feed(LF), 커서를 현재 행의 맨 좌측과 수직 아래로 이동시키는 문자열이다. 즉, 줄 바꿈을 의미함. hex 코드로는 0x0d, 0x0a 이며, 아스키 코드에서 표현 방식은 "\r\n" 입니다.
HTTP Request의 구조
- Method : 사용자가 서버에 요청 시 수행하고자 하는 동작 |
- Header : 이름: 값 형태를 가짐. Header는 상황에 따라 많은 데이터를 포함할 수 있기 때문에 Header 부분의 끝을 표시하기 위한 CRLF을 한 번 더 출력 |
- HTTP Response
HTTP Response는 Client 요청에 대한 서버의 응답이다. Response의 구조도 Request의 구조와 마찬가지로 각 줄은 CRLF로 줄 바꿈이 이루어져야 한다.
HTTP Response의 구조
- Version : 사용하는 HTTP의 버전 |
- Header : Header 부분의 각 줄은 이름: 값의 형태로 이루어집니다. Header의 끝을 표시하기 위해 CRLF를 한 번 더 출력 |
웹 해킹에서는 사용자의 입력에 의한 서버의 응답을 주목해야 한다.
아래의 Status Code를 통해 서버와의 연결 상태를 알 수 있다.
Status Code
- 200번 영역
- 200 OK
- 201 Created
- 사용자의 요청에 대한 서버의 처리가 성공하였음을 나타냅니다.
- 300번 영역
- 301 Moved Permanently
- 302 Found
- 사용자가 요청한 리소스가 다른 경로로 변경된 경우를 나타내는 영역입니다. 웹 브라우저에서 300번 영역의 응답 상태 코드가 반환되면, Response Header에 포함되어 있는 Location 헤더의 값으로 리다이렉션 합니다.
- 400번 영역
- 400 Bad Request
- 사용자가 전달한 데이터 또는 구조의 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음을 의미합니다.
- 403 Forbidden
- 사용자가 해당 웹 리소스에 접근할 권리를 가지고 있지 않음을 나타냅니다.
- 404 Not Found
- 사용자가 요청한 웹 리소스의 경로에 대해 응답할 데이터가 없음을 나타냅니다.
- 405 Method Not Allowed
- 사용자가 요청한 Method가 서버에서는 허용하지 않는 Method임을 나타냅니다.
- 사용자가 서버에 요청하는 구조 또는 데이터가 잘못되었음을 나타내는 영역입니다.
- 500번 영역
- 500 Internal Server Error
- 서버의 에러가 발생하였음을 나타냅니다.
- 503 Service Unavailable
- 서버가 사용자의 요청을 처리할 준비가 되지 않았음을 나타냅니다.
- 서버의 에러와 관련된 영역입니다.
- HTTP - Cookies : 웹 브라우저에 저장하는 데이터
HTTP는 하나의 Request와 Response의 쌍이 독립적으로 구성되어 통신하는 connectionless, stateless 프로토콜입니다.
과거에는 네트워크, 서버 등의 부하로 인해 connectionless 속성이 강조되었지만, 최근에는 네트워크, 서버 등의 성능 향상으로 일정 시간 동안 사용자와 서버가 계속 연결을 맺고 있는 방식을 사용한다.
connectionless 속성 |
connectionless 속성은 하나의 요청에 하나의 응답을 한 후 네트워크 연결을 끝맺는 것이다. |
stateless 속성 |
stateless 속성은 네트워크가 연결이 끝맺을 때 상태를 유지하지 않는 것을 의미한다. |
웹 브라우저는 HTTP Response의 Set-Cookie Header나 Javascript document.cookie를 통해 데이터를 쿠키에 저장한다.
document.cookie = "name=test;"
document.cookie = "age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;"
데이터를 위와 같은 key=value; 쌍의 javascript 형식으로 쿠키에 저장하고 ;뒤에 쿠키의 만료시간, 접근할 수 있는 도메인 등 추가 옵션을 설정할 수 있다.
쿠키는 인증 상태를 포함할 수 있다.
value 에 guest를 넣어 전송하면 브라우저는 Cookie: id=guest;를 서버에 보내고 서버는 해당 정보를 통해 인증된 사용자의 정보를 응답한다.
쿠키는 사용자의 브라우저에 저장됩니다. 인증 상태를 쿠키에 저장하게 되면 아래와 같은 상황이 발생하게 됩니다.
- HTTP - Session : 서버에 저장하는 데이터
쿠키에 인증 상태를 포함한 데이터를 저장하면 사용자가 임의 사용자로 인증된 것 처럼 요청을 조작할 수 있다. 따라서 서버에 데이터를 저장하기 위해 Session(세션)을 사용한다. 세션을 활용하면 데이터를 서버에 저장하고 해당 데이터에 접근할 수 있는 유추할 수 없는 랜덤한 문자열 키인 Session ID를 만들어 응답한다. 브라우저는 Session ID를 쿠키에 저장하고 이후에 HTTP 요청을 보내면 서버에서 키에 해당하는 데이터를 가져와 인증 상태를 확인합니다.
쿠키는 데이터 자체를 사용자가 저장하며, 세션은 서버가 저장한다는 핵심적인 차이점이 존재한다.
- HTTP / HTTPS
웹은 업무, 은행, 쇼핑 등 다양한 분야에서 사용되고 있고 웹 서비스와 통신하는 요청과 응답에 개인 정보(이름, 전화번호, 주소, 카드번호) 및 기업의 자산 등 민감한 정보들이 포함될 수 있다.
HTTP는 모든 데이터를 암호화 되지 않은 평문으로 전송한다. 네트워크에서 전송된 데이터를 감청할 수 있다면 HTTP로 통신하는 데이터는 평문으로 노출되고 웹에서 민감한 정보를 다룰 때 문제가 될 수 있다.
HTTPS는 Transport Layer Security(TLS), Secure Sockets Layer(SSL)를 사용해서 암호화한다. 공개키 암호화를 사용해서 클라이언트와 서버가 키를 교환하기 때문에 HTTP 방법보다 안전하다.
빨간 글자는 요청 값에 해당하며, 파란 글자는 응답 값에 해당한다. 이를 통해 HTTP와 달리 HTTPS는 네트워크상에서 데이터들이 암호화되어 전달되기 때문에 일반적으로 어떤 내용의 통신을 하는지 알 수 없다.
- Domain Name / Host Name : 인터넷(웹) 네트워크상에서 컴퓨터를 식별하는 이름
URI 구성 요소 중 Host는 웹 브라우저가 어디에 연결할지 정한다. Domain Name이나 Internet Protocol(IP) Address가 Host에 사용된다.
IP Adress는 네트워크상에서 통신이 이루어질 때 장치를 식별하기 위해 사용되는 주소다. 불규칙한 숫자로 이루어진 IP Address를 사람이 외우기 쉽고, 의미를 부여하기 위해 Domain Name을 사용한다.
Domain Name을 이용해 Host를 조회할 때는 Domain Name과 IP Adress 정보를 매핑해 저장하는 Domain Name Server(DNS)에서 조회해 등록된 IP Address를 가져와 사용한다. 웹 브라우저에서 http://example.com/ 주소로 접속할 경우 DNS에서 example.com(Domain Name)의 IP와 통신합니다.
- 웹 서버 어플리케이션
Server : 인터넷상에서 사용자에게 서비스를 제공하는 컴퓨터이다. 그 중 웹서버는 사용자와 HTTP를 이용하여 통신하는 서버이다.
Application : 서버에서 설정하느 특정 기능들을 수행하는 소프트웨어이다.
- Web Server
웹 서버는 사용자의 HTTP 요청을 해석하여 처리한 후 응답하여 주는 역할한다.
대표적으로 nginx, Apache, Tomcat, IIS 등이 있다.
웹 서버는 사용자로부터 받는 요청을 웹 서버 자체적으로 처리할지, 들어온 요청에 알맞은 내부 서비스로 연결할지를 정한다.
예를 들어 클라이언트가 접근한 URI가 .html 확장자를 가진 리소스라면 웹 서버에서 해당 경로의 html을 반환해주고, .php 확장자를 가진 리소스라면 php 엔진을 통해 해당 요청을 처리한다. 또한 /payment/ 경로로 시작하는 요청에 대해서는 payment를 처리하기 위한 어플리케이션에 요청을 연결해주는 역할을 수행하는 것이 가능하다.
- Web Application
웹 어플리케이션은 사용자의 요청을 동적으로 처리할 수 있도록 만들어진 어플리케이션이다.
웹 어플리케이션을 작성할 때는 사용자가 요청한 내용을 동적으로 처리하기 위해 Web Application Language가 사용되며 대표적으로 PHP, NodeJS, Python, Java 등이 존재한다.
이 외에도 굉장히 많은 언어가 존재하며 Python의 django와 flask, Java의 spring처럼 웹 개발을 편하게 해주는 프레임워크도 많이 존재한다.
또한 웹 어플리케이션은 서버에서 동작하기 때문에 웹 어플리케이션 구현체에서 취약점이 발생하게 되면 서버에 직접적인 영향을 끼칠 수 있다.
- DataBase Management System
DataBase Management System (DBMS)은 데이터베이스 내의 데이터 조회/수정/삽입(CRUD)을 용이하게 할 수 있도록 도와주는 서버 어플리케이션이다. MySQL, MS-SQL 등을 DBMS라 하며 해당 어플리케이션들이 관리하는 데이터를 데이터베이스라고 한다.
3. 웹 해킹 개요
- 웹 해킹 개요
웹 해킹은 해킹의 의미처럼 본래의 의도와는 다른 동작을 일으키거나 주어진 권한 이상으로 정보를 열람, 복제, 변경 가능한 행위가 웹에서 발생하는 것을 말합니다.
기업의 업무, 금융, 쇼핑 등 다양한 분야를 웹으로 서비스하면서 제공하는 서비스의 복잡도와 다양성이 증가하게 되었습니다. 그로 인해 서버와 어플리케이션에서 처리하는 사용자의 입력 역시 다양해졌고 기능 구현의 복잡도로 인해 개발 당시에는 의도치 않았던 동작을 일으킬 수 있는 웹 해킹의 위협도 따라서 증가하게 되었습니다.
기업에서 사용하는 웹에는 기업의 내부 자료, 직원 정보 등이 있고 금융/쇼핑 분야는 사용자들의 개인 정보, 금융(카드) 정보 등 서비스의 형태에 따라 수많은 정보가 웹에 포함되어 있으며 공격자는 가치 있는 정보를 획득하기 위해 웹 해킹을 시도하고 있습니다.
또한 많은 기업들이 자산을 보호하기 위해 많은 서비스와 네트워크를 내부망으로 사용하지만, 기업의 대표 사이트 또는 제품(서비스) 등과 같이 웹을 통해 서비스를 운영하는 경우가 많습니다. 이런 웹 서비스들은 내부망과 연결되어 있을 가능성이 높아 공격자들이 내부망 침투를 위해 가장 먼저 웹을 공격하기도 합니다.
따라서 웹에서 발생할 수 있는 취약점에 대해 익히고 방어 대책을 연구하여 사전에 대응할 수 있는 역량을 키우는 것이 대두되고 있습니다.(dreamhack.io/learn/1/6#23)
- 웹 해킹 공격 벡터
Client-side Attack
서비스 사용자에 대한 공격을 의미합니다.
웹을 이용하는 사용자는 웹 브라우저를 통해 서비스를 제공받는데 웹 서버가 제공해주는 데이터가 공격자에 의해 변조되었을 경우 웹 브라우저에서 렌더되는 과정에서 취약점이 발생하는 경우가 대표적입니다.
예를 들어 게시판 서비스의 경우 사용자의 입력을 특별한 검증 없이 출력하게 되면 사용자의 입력도 html 처럼 취급되며 스크립트 또한 삽입할 수 있습니다. 공격자는 이를 악용하여 다른 사용자의 웹 브라우저에 원하는 행위를 수행할 수 있습니다.
Server-side Attack
서비스를 운용하는 서버에 대한 공격을 의미합니다.
다양한 공격 형태가 존재하며, 공격자가 공격에 성공하게 되면 서버의 어플리케이션 코드 또는 다른 사용자의 정보 유출, 서버 탈취 등으로 이어질 수 있습니다. 운영되는 서비스의 구조와 특징에 따라 위협의 형태가 달라집니다.
또한 서비스의 형태에 따라 가지게 되는 특별한 공격 방법이 존재할 수도 있습니다. 예를 들어 송금 기능을 지원하는 서비스에서 자신이 가진 금액보다 더 큰 금액으로 요청하게 될 때 특별한 검증 절차 없이 기능이 수행된다면 공격자는 금전적인 이득을 취할 수 있게 됩니다.
'💻 개인공부 💻 > 웹' 카테고리의 다른 글
웹 서버로 데이터를 보내는 방법, Requesting (0) | 2020.05.22 |
---|---|
MVC 패턴 구조 (0) | 2020.05.22 |
[웹 기초] 웹 개발을 위한 프론트엔드 VS 벡엔드 용어 정리 (0) | 2020.03.11 |
[웹 오류] The port 8080 is already in use (0) | 2020.03.11 |