1주차
chapter 1. 웹 보안의 개요
1.1 보안 대책이 필요한 이유
1.1.1 취약성은 왜 발생할까?
-
취약성은 상처입기 쉬운 상태를 말한다.
-
컴퓨터에서 취약성이란 부정한 방법으로 접근하거나 정보를 훔칠 수 있는 상태가 되는 보안상의 버그를 의미한다.
1.1.2 비기능 요건의 중요성
-
기능 요건 : 시스템에서 반드시 구현되어야 하는 요건
-
비기능 요건 : 시스템 사용의 주목적이 되지 않는 요건
1.2 웹 취약성의 종류와 동향
1.2.1 보안 지침에서 확인하는 취약성의 종류와 동향
- 안전한 웹사이트를 만드는 법 - 정보처리추진기구
- OWASP Top 10 - OWASP
1.2.2 보안 관련 정보 수집
chapter 2. 실습 준비
chapter 3. HTTP
3.1 HTTP 기초
-
웹 애플리케이션은 서버가 보낸 HTML, CSS, 이미지 등의 리소스 데이터를 사용해 구성된다.
-
브라우저는 HTTP라고 하는 통신 프로토콜에 따라 서버와 통신해 리소스를 가져오거나 데이터를 생성하고 업데이트 하며 삭제한다.
3.1.1 URL
-
인터넷에서 리소스가 위치하는 장소를 나타내는 문자열을 URL이라고 한다.
- 스키마명(프로토콜)
- 통신 프로토콜을 표시한다.
- 호스트명
- 서버의 위치를 표시한다.
- 포트 번호
- 서버에서 서비스를 식별하는 번호.
- 경로
- 서버에서 리소스의 위치를 표시한다.
3.1.2 DNS
- 스키마명(프로토콜)
-
사용자가 웹 애플리케이션에 접속할 때 브라우저는 먼저 DNS 서버에서 해당 URL의 서버 주소를 확인해야 한다.
-
브라우저는 URL의 호스트명을 IP 주소로 변환해 서버에 접속한다. 그러나 브라우저는 호스트명의 IP 주소를 알지 못하기 때문에 DNS를 사용해 주소를 확인한다.
3.1.3 TCP/IP
-
컴퓨터는 양쪽 모두 정해진 규약에 따라 데이터를 주고 받아야 하는데 이 규약을 통신 프로토콜이라고 한다.
-
TCP와 IP를 포함하는 통신 프로토콜을 총칭해 TCP/IP라고 하며 4계층으로 구성된다.
3.1.4 HTTP 메시지
-
HTTP는 브라우저와 서버 사이에서 HTTP 메시지라는 정해진 형식에 따라 데이터를 주고 받는다.
-
HTTP 요청
- HTTP를 사용해 브라우저에서 서버로 요청을 보내는 것을 HTTP 요청이라고 한다.
- HTTP 요청 메시지는 요청 라인, 헤더, 바디로 구성된다.
-
HTTP 응답 - 브라우저의 요청에 따라 서버가 보내주는 데이터를 HTTP 응답이라고 한다. - HTTP 응답 메시지는 상태 라인, 헤더, 바디로 구성된다.
3.1.5 HTTP 메서드
-
GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE
3.1.6 상태코드
-
1xx
- 현재 처리 중인 정보를 전달한다.
-
2xx
- 정상 처리된 정보를 전달한다.
-
3xx
- 이동(리다이렉트)과 관련된 정보를 전달한다.
-
4xx
- 브라우저의 요청에 문제가 있는 상태를 전달한다.
-
5xx - 서버에 문제가 발생한 상태를 전달한다.
3.1.7 HTTP 헤더
-
HTTP 헤더는 바디의 부수적인 정보와 데이터 송수신에 필요한 정보다.
-
HTTP 헤더는 Request, Response 양쪽 모두에서 사용한다.
-
대표적인 Request 헤더
- Host
- User-Agent
- Referer
-
대표적인 Response 헤더
- Server
- Location
-
대표적인 엔티티 헤더
- Content-Length
- Content-Type
3.3 안전한 통신을 위한 HTTPS
3.3.1 HTTP의 약점
- HTTP 통신은 보안과 관련해 크게 세 가지 약점이 있다.
- 통신 데이터 도청이 가능한 점
- HTTP는 통신 데이터를 암호화하는 시스템은 없다. 따라서 공격자가 통신 경로의 도청이 가능하다면 사용자가 주고 받는 데이터를 훔쳐볼 수 있다.
- 통신 상대의 진위 여부 확인이 어려운 점
- HTTP는 통신 대상 서버가 실제 서버인지 진위 여부를 확인하는 시스템이 없어서 암호화되지 않은 HTTP 통신 경로는 공격자가 요청 URL로 서버인 척할 수 있다.
- 통신 과정에서 데이터 수정 여부가 확인이 안 되는 점
- 통신 경로에서는 통신 내용이 올바른지 검증하는 구조가 없다.
3.3.2 HTTP 약점을 해결하는 TLS
- HTTP의 세 가지 약점을 해결하려면 HTTPS를 사용해 통신해야 한다.
- HTTPS는 TLS라고 하는 통신 프로토콜을 사용해 HTTP 데이터를 암호화해서 통신하는 구조다.
- HTTP 데이터 통신을 하기 전에 TLS 핸드셰이크라고 하는 일련의 암호 통신 과정을 진행한다.
- 통신 데이터 암호화
- TLS는 데이터를 암호화하는 기능과 데이터의 변조를 막는 기능을 제공한다.
- 평문 데이터를 암호화하여 전송하면 상대는 암호문을 복호화하여 데이터의 내용을 볼 수 있다.
- 통신 상대 검증
- TLS는 전자 인증서로 통신 상대를 확인하며, 전자 인증서는 신뢰 가능한 기관인 CA에서 발행한다.
- 서버에서 전송된 인증서는 브라우저가 검증하고 다시 브라우저와 OS에 있는 인증서와 대조한다.
- 통신 데이터 변경 체크
- TLS는 데이터 변조를 체크하는 기능도 제공한다.
- TLS는 인증태그 라는 검증용 데이터를 사용하는데 인증 태그는 데이터의 암호화와 동시에 작성되어 상대에게 전송되며, 수신자는 복호화와 동시에 인증 태그를 사용해 암호문의 변조를 체크한다.
3.3.3 HTTPS 도입 권장
-
웹 애플리케이션 개발자는 사용자 데이터의 보안을 유지하기 위해 모든 페이지에 HTTPS를 도입해야 한다.
3.3.4 안전한 콘텍스트만 이용 가능한 API
3.3.5 Mixed Content의 위험성
-
HTTPS를 사용한 웹 애플리케이션에서 HTTP 통신을 사용하는 리소스가 혼재되어 있는 상태를 Mixed Content라고 한다. 웹 애플리케이션이 HTTPS를 도입했다고 하더라도 사용하는 자바스크립트와 이미지 등의 하부 리소스가 HTTP 통신을 사용하면 안전하다고 말할 수 없다.
3.3.6 HSTS를 사용해 HTTPS 통신 강제하기
-
HSTS 구조를 적용하면 사용자가 HTTPS 통신을 사용하도록 강제할 수 있다. HSTS를 유효화하려면 응답 헤더에 Strict-Transport-Security 헤더를 추가한다. 브라우저는 Strict-Transport-Security 헤더를 받으면 이후의 웹 애플리케이션 요청은 HTTPS를 사용한다.