- 3 계층 구조(티어) - 프레젠테이션, 로직, 데이터 티어로 구성되어 있다.
- Client / Server 영역으로 구분 가능
- Client
- 프레젠테이션 티어
- Server
- 로직 티어
- 웹서버와 웹 프레임 워크를 포함한다.
- 클라이언트로부터 전송된 HTTP 요청을 처리 후, 필요에 따라 데이터 티어와 통신한다.
- 데이터 티어로부터 반환된 데이터를 가공하여 최종적으로 클라이언트에게 전달
- 웹 서버로는 IIS, Apache, NGIX 등이 있음
- 웹 프레임 워크에는 ASP.NET, Spring, Django 등이 있음
- 데이터 티어
- DBMS와 Database로 이루어진다.
- 로직 티어로부터 들어오는 요청(SQL 쿼리문 등)을 처리 및 반환
- 웹을 구현하기 위한 네트워크 프로토콜
- HTTP 통신은 요청과 응답으로 구성된다.
<메소드><요청 URI><버전>
<헤더>
<바디>
- 데이터 전송이 필요하지 않으면 바디 없이 첫 줄과 헤더만으로 메시지 구성 가능
- Method
- 서버에게 어떤 명령을 실행하맂 알려주는 역할을 한다.
- Method 종류
- GET
- 지정된 리소스를 요청하는 메소드
- 웹 페이지나 각종 이미지 파일들의 내용을 가져올 때 사용
- POST
- 클라이언트 쪽에서 데이터를 서버 쪽으로 전달할 때 사용하는 메소드
- 특정한 데이터를 전달할 때 사용
- GET
- 과거에는 GET과 POST 메소드 위주로 구현되었지만, 요즘은 REST API 구현을 위해 PUT과 DELETE 메소드도 많이 사용한다.
- CRUD HTTP : 데이터 관리를 위해 사용 되는 GET, POST, PUT, DELETE
- SQL 명령어와도 완벽하게 짝지을 수 있음
- 요청 URI
- 특정 리소스의 위치를 프로토콜과 호스트명을 모두 표기하거나, 상대 경로로도 표시할 수 있음
- 요청의 경우 ?가 사용되어 요청 URI가 구성될 수 있다.
- ? 뒤의 부분을 쿼리 스트링이라고 한다.
- &를 이용하여 각 파라미터를 구분할 수 있다.
- 버전
- 요청 메시지가 사용하고 있는 HTTP 버전을 표기한다.
- 응답 메세지에도 버전이 표기함
- 이를 통해 클라이언트와 서버가 서로 프로토콜 버전을 확인할 수 있음
-
헤더는 종류에 따라 요청 메시지와 응답 메시지를 선택적으로 상요할 수 있음
-
헤더는 리스트의 형태로 여러 개가 전송 될 수 있음
헤더이름: 헤더 값
-
헤더 값은 헤더에 따라 형식이 조금 달라질 수 있음
-
HOST 헤더
- 서버의 도메인 이름과 포트를 명시한다
- 포트 번호는 생략될 수 있음
- 일반적으로 웹 서비스에서는 80번 포트를 사용한다.
-
User-Agent 헤더
- 클라이언트 소프트웨어를 식별할 수 있는 헤더
- 웹 브라우저의 이름과 버전 또는 실행 중인 시스템의 환경, 브라우저가 사용하는 플랫폼 정보 등이
- User-agent 정보를 이용해 클라이언트의 환경에 따라 서버 동작을 바꿀 수 있음
- 이를 이용한 공격을 User-agent spoofing이라 함
- 클라이언트 소프트웨어를 식별할 수 있는 헤더
-
Accept, Accept-Language, Accept-Encoding
- Accept 헤더는 클라이언트가 어떤 컨텐츠 타입을 처리할 수 있는지 서버에게 알려준다.
- Accept-[parameter]에 따라서 언어, 인코딩 등의 컨텐츠 타입 전달을 한다.
-
Referer
- 이전 웹 페이지의 주소를 알려준다.
- 해당 헤더를 참조해 주소 요청의 근원지가 어디인지 알 수 있다.
-
Content-Type, Content-Length
- 바디가 존재하는 경우 바디의 종류와 길이를 알려주는 헤더
- 요청/응답 메시지에서 사용
-
Cookie
- 쿠키
- 쿠키는 변수와 값의 쌍으로 구성된 집합
- 여러 요청에 걸쳐 클라이언트에서 동일한 데이터를 전달할 필요가 있을 때 사용
- 하나의 쿠키를 통해 여러 데이터를 전달할 수 있다.
- 대표적인 예시로는 세션 ID 등이 있음
- 쿠키
-
바디
- 데이터가 전송되는 부분
- Content-Type에 따라 형태가 달라진다
<버전> <응답 코드> <응답 코드 텍스트>
<헤더>
<바디>
-
첫 줄만 요청 메시지와 다르고, 헤더와 바디 부분의 형식은 동일하다.
-
버전
- 응답 메시지의 HTTP 버전을 알려준다.
-
응답 코드/응답 코드 텍스트
- 숫자와 텍스트로 표시된다.
- 요청이 성공된 것을 알려주거나, 에러의 종류를 알려준다.
- 응답 코드 뒤의 텍스트는 사용자의 가독성을 위함이다.
- 응답 코드는 100~500번대까지 있음
- 앞자리 숫자에따라 응답 코드가 의미하는 바가 달라진다.
- server
- server 헤더는 웹 서버와 웹 프레임웤의 버전 등의 정보를 알려준다.
- 보안 상의 이유로, 버전 정보를 삭제하여 전송하기도 함
- Set-Cookie
- 서버에서 클라이언트로 쿠기를 전달할 때 사용
- 전달된 쿠키는 웹 브라우저에서 저장
- 유효기간 동안 요청 메시지의 cookie헤더를 통해 다시 전송된다.
- 헤더의 종류
- Expires
- 쿠키의 유효기간을 설정한다.
- Expires가 지정되지 않으면, 세션이 종료 될 때까지 유효기간을 가진다.
- 일반적으로는 웹 브라우저가 종료되면 세션이 종료 된다.
- 특별한 경우 서버의 구현 방법에 따라 세션이 유지되기도 한다.
- Path
- 쿠키를 전송할 리소스의 경로를 지정한다.
- 지정된 리소스를 요청 할 때 쿠키를 전송하는데, 서브 디렉터리까지 같이 매칭함
- Secure
- 해당 옵션을 지정한 쿠키는 HTTP 요청 시에는 전달되지 않고, HTTPS 프로토콜을 사용하여 요청이 암호화되어 전송 될 때만 전달 된다.
- HttpOnly
- 쿠키가 노출되지 않도록 보호하기 위한 옵션
- 해당 키워드를 사용하면 쿠키 값이 자바스크립트에 의해 접근 되는 것을 방지할 수 있다.
- X-Frame-Options
<frame>
또는<iframe>
등을 사용하여 웹 페이지가 출력 되는 것을 제어하기 위한 헤더이다.- 프레임을 이용하여 웹 페이지를 표시하면, 클릭 재킹 공격에 노출 될 수 있다.
- 클릭 재킹 : 공격자가 웹 페이지의 컴포넌트에 악성 링크를 보이지 않게 숨겨두는 공격 유형
- Deny와 SAMEORIGIN 옵션이 존재한다.
- X-XSS-Protection
- 리플렉티드 크로스 사이트 스크립팅 공격이 탐지 되었을 때, 웹 페이지가 로딩 되는 것을 막아준다.
- X-Content-Type-Otions
- MIME 스니핑을 차단하기 위해 사용되는 헤더
- MIME 스니핑
- 웹 브라우저가 특정 파일을 읽을 때 파일의 실제 내용과 Content-Type에 설정도니 내용이 다를 때 파일의 내용에 따라 파일의 형식을 추측하여 실행하는 점을 이용한 공격
- Expires