웹 아키텍처
일반적인 웹 아키텍처는 클라이언트 - 웹 서버 - 데이터베이스의 형태로 구성되어 있다.
영역별로 프론트 엔드(Front-End)와 백 엔드(Back-End)로 나뉜다.
웹 개발자들은 프론트 엔드 개발자와 백 엔드 개발자로 나뉘며, 두개를 전부하는 풀스택 개발자도 있다.
아래는 웹 아키텍처는 웹을 단순화 시킨 구조로 실제 환경은 이보다 훨씬 복잡하다.
취약점 진단에 앞서서 웹 아키텍처에 대한 이해는 필수이다.
프론트 엔드 = HTML, CSS, JavaScript
백 엔드 = PHP, JSP, ASP
웹 아키텍처 동작 원리 분석
클라이언트 측에서 사용자가 웹 브라우저를 통해 사이트 접속을 하게 된다.
그러면 웹 브라우저에서는 가장 먼저 도메인에 따른 IP 변환 작업을 한다.
이유는 데이터 전송을 위해서는 IP가 반드시 필요하기 때문이다. → 도메인만으로는 통신 불가
이후 요청 메시지를 제작한다.
클라이언트에서 브라우저를 통한 사이트 접속
1. 웹 사이트 접속 - URL 입력
2. 도메인 → IP 변환 작업
3. HTTP 요청 메시지 제작 후 웹 서버에 전송
HTTP 프로토콜은 TCP/IP 통신을 기반으로 하기 때문에 3-way hand shake 과정을 거쳐야 한다.
클라이언트는 웹 서버와 통신하기 위해 다음 단계를 거친다.
1. 3-way hand shake 과정
2. HTTP 요청 메시지 웹 서버로 전송
3. 요청에 따른 DB 연결 및 질의 과정 → 정적 페이지인 경우 질의 X
4. 응답 메시지 제작 후 클라이언트로 전송
응답 메시지를 받으면 이를 해석 후 바디에 있는 데이터인 HTML 코드를 웹 브라우저가 해석 하여 사용자에게 깔끔한 인터페이스를 제공하게 된다.
클라이언트
클라이언트 프로그램은 대표적으로 웹 브라우저가 있으며, 웹 브라우저 종류는 다음과 같다.
- 크롬, 엣지, 사파리, 파이어폭스 등
웹 브라우저는 사용자가 입력한 URL을 이용해 서버에 자원을 요청하고, 서버로부터 응답을 받아서 해석 후 사용자에게 GUI 환경을 제공한다.
웹 사이트 구조 분석
웹 사이트 구조는 HTML, CSS, JavaScript 3요소로 구성되어 있다.
웹에 가독성 있는 인터페이스를 구성 = HTML, CSS 사용
동적인 인터페이스 구성 = JavaScript 사용
아래와 같은 일반적인 웹 사이트 구조는 웹 서버와 통신을 위해 HTML 태그를 사용하거나 JavaScript를 통해 통신이 가능하다.
오늘날의 웹 사이트 구조는 이전의 구조에 비해 큰 변화를 가지고 왔다.
Ajax라는 기술로써 페이지 동기화 필요 없이 서버에 요청/응답을 받아 페이지 재구성(렌더링)이 가능해졌다.
기존 웹 패러다임을 전환하는 기술로써 현재 많이 사용되고 있다. 또한 백엔드 측에 부하율을 낮출 수 있기 때문에 트래픽이 많이 발생되는 웹 사이트의 경우 Ajax 기술을 적극적으로 사용하고 있다.
Ajax 란? 자바스크립트를 이용해서 비동기적(Asynchronous)으로 서버와 브라우저가 데이터를 교환할 수 있는 통신 방식을 의미한다.
일반적인 웹 사이트 구조 = 서버로부터 웹 페이지가 반환되면 화면 전체를 갱신
Ajax 기반 웹 사이트 구조 = 갱신에 필요한 일부만 로드하여 갱신
페이지 전체를 로드하여 렌더링할 필요가 없으므로 빠른 퍼포먼스와 부드러운 화면 표시 효과가 있다.
Ajax 기반 웹 사이트 진단
Ajax 기반의 웹 사이트라고 해서 진단 방법이 달라지는 것은 아니다.
요청과 응답의 행위는 동일하게 하기 때문이다. 그러나 이 과정에서 컨텐츠 타입(Content-Type)이 달라 당황하는 경우가 있는데 전혀 그럴 필요가 없다. 응답 컨텐츠의 경우 HTML이 아닌 xml, json 타입이라도 인터페이스를 구성하는 데이터로 사용되기 때문에 JavaScript를 분석 후 알맞게 데이터 변조를 하면 된다.
Ajax 기반 웹 페이지 진단 시 응답값 내 flag의 N을 Y로 변조 후 페이지 출력을 확인하는 등의 방법을 사용한다.
웹 서버 그리고 웹 어플리케이션 서버
웹 서버는 클라이언트 자원 요청에 따른 웹 서비스를 제공한다.
웹 서버의 종류는 아파치, IIS, Nginx, WebtoB, Oracle HTTP Server 등이 있다.
JAVA Web Application 환경의 경우 웹 서버와 웹 어플리케이션 서버를 분리하여 사용한다.
웹 서버 = 정적인 컨텐츠 자원 제공 → 이미지, 텍스트 파일
웹 어플리케이션 서버(WAS) = 동적인 컨텐츠 자원 제공 → jsp, .do
2개의 서버를 사용하여 자원 처리에 효율적이며 유연한 서비스 제공을 목표로 한다.
웹 서버 동작 원리 분석
클라이언트 측에서 웹 서버에 요청 메시지를 보내면 웹 서버는 요청된 자원 유/무를 검토하여 클라이언트 측에 응답 메시지에 실어 보낸다. 이때 웹 서버 측에서는 어떤 동작 원리로 클라이언트가 요청한 자원을 호출할까?
웹 서버에 index.jsp라는 자원이 있는데, 어느 경로에 있는 index.jsp를 찾는 걸까?
웹에서 호출할 수 있는 자원이 있는, 웹 디렉터리
우리가 URL로 서버에 자원을 요청하는 것들은 웹 서버에 어떠한 설정된 경로로 인해 가능하다.
이렇게 웹 서버에서 바라보는 경로를 웹 디렉터리, 웹 루트, 도큐먼트 루트 등으로 부른다.
이 설정 파일은 파일 다운로드/업로드 취약점 공격 시 많이 활용된다.
→ 웹 디렉터리를 설정하는 파일은 파일 다운로드/업로드 취약점 공격에 많이 활용됨.
JAVA Web Application 환경의 3-Tier 구조 동작 원리
사용자 측에서 정적 자원을 요청할 경우 웹 서버 측에서 처리 후 응답 메시지를 보낸다.
동적 자원을 요청할 경우 웹 서버는 웹 어플리케이션 서버로 포워딩(Forwarding)하며, 웹 어플리케이션 서버에서 이를 받은 후 어플리케이션 로직에 따라 처리 후 응답 메시지를 사용자에게 보낸다.
만약, 로직 상에 데이터베이스 질의 과정이 있을 경우 데이터베이스와 연결을 한다.
JAVA Web Application 환경의 WS/WAS 구성
웹 서버와 웹 어플리케이션은 논리적인 구성과 물리적인 구성으로 분리된다.
대부분 하나의 회사에서 제공되는 웹 서버와 웹 어플리케이션 서버를 쌍으로 사용한다.
가격면이나, 설치, 유지보수 등 대응면에서 훨씬 효율적이기 때문이다.
WAS는 정적인 자원을 처리하지 못할까?!
→ 처리 가능하다!
근데 왜 굳이 WS와 WAS로 분리 하였을까?
→ 업무 분담을 하여 자원 처리에 대한 효율성을 극대화 하기 위해서
웹 서버와 웹 어플리케이션 서버를 분리하는 이유
웹 서버는 정적 자원 처리에 대해 최적화가 되어 있다.
웹 어플리케이션 서버는 동작 자원 처리에 최적화가 되어 있다.
업무 분담을 하여 자원 처리에 대한 효율성을 극대화 시킨다.
데이터베이스
데이터베이스는 동적인 컨텐츠를 제공하기 위해 데이터를 저장해두는 저장소로 일반적으로 사용자 정보, 상품 정보, 커뮤니티 정보 등 수 많은 정보들이 저장되는 곳으로 게시판에 글을 쓰고 보고, 회원 가입을 하여 로그인을 할 수 있는 이유도 데이터베이스 때문이다.
Server Side와 Client Side에 대한 이해
웹 구조는 크게 Server Side와 Client Side로 나눌 수 있다.
Client-Side Script = 웹 클라이언트에서 해석되는 스크립트(언어) → HTML, CSS, JavaScript
Server-Side Script = 웹 어플리케이션 서버에서 해석되는 스크립트(언어) → PHP, JSP, ASP /.NET
웹 어플리케이션 서버에 따라 해석할 수 있는 언어가 달라진다.
Tomcat의 경우 JSP 해석이 가능하다.
Client-Side Script 기반 보안 검증이 안전하지 않은 이유
클라이언트 측에서 보안 검증 절차가 구현 되어있다 하더라도 서버 측 보안 검증 로직을 반드시 구현해야 한다.
웹 프록시 도구와 개발자 도구를 통해 Client-Side Script 조작 및 값 변조가 가능하기 때문에 사실상 검증 자체가 무의미하다. 뿐만 아니라 input 태그의 hidden 타입의 전송도 웹 프록시 도구 혹은 개발자 도구로 확인 할 수 있으며, 변조가 가능하기 때문에 해당 값을 신뢰해서는 안된다.
클라이언트 측 보안 검증 절차 = JavaScript에 의한 구현 = 웹 프록시 도구로 변조 가능
input 태그의 hidden 타입은 게시글 번호를 사용자에게 굳이 출력하지 않아도 되는 경우에 사용한다.
사용자 정보 수정 페이지 등 중요한 기능에 input 태그의 hidden 타입으로 전송하게 되면 웹 프록시 도구에 의해 노출되기 때문에 값이 변조될 수 있으므로, 세션과 암호화된 쿠키를 사용하여 사용자 인증을 한다.
'웹 해킹 > 웹 기초 지식' 카테고리의 다른 글
Cilent-Side Script, Server-Side Script에 대한 이해 (1) | 2024.11.15 |
---|---|
쿠키와 세션 (1) | 2024.11.09 |
웹의 핵심 기술 HTTP 프로토콜 (0) | 2024.11.08 |
XAMPP 설치 및 URL 예약문자, URL 인코딩 실습 (3) | 2024.11.07 |
자원을 지정하는 URL (0) | 2024.11.06 |