웹브라우저의 보안모델 1

브라우저와 네트워크에 대해 더 깊게 이해하기 위해 웹브라우저의 보안모델에 대해 공부해보았다!

웹브라우저의 역사

1990년 팀 버너스 리가 HTML과 웹 서버, 웹 브라우저를 최초로 발명하였다.
이 떄의 브라우저는 정적인 HTML만을 렌더링하였다.

195년엔 마크 로웰 앤드리슨이 웹브라우저 내에서 이미지, 플러그인의 요소를 조합할 수 있는 언어가 필요하다고 생각하여 javascript를 웹브라우저에 도입하였다.

웹 브라우저에서 javascript를 도입한 이후 javascript를 이용해서 DOM에 접근할 수 있게 되었다.
즉 javascript로 HTML로 표현된 객체에 접근하여 변경, 제거등의 작업을 수행할 수 있게 되었다.

AJAX(Asynchronous JavaScript and XML)

페이지가 로드된 이후 javascript를 이용하여 비동기식으로 서버와 상호작용 하는 것을 AJAX라고 한다.
AJAX는 페이지 전체를 로딩하지 않고도(새로고침 없이) 비동식으로 필요한 부분만 동적으로 처리하거나 로딩할 수 있다.

test.html 파일이다.

1
<h1>It`s works!</h1>

index.html 파일이다.
AJAX를 사용한다. httpRequeset를 통해 test.html을 요청한 다음 state를 보고 innerHTMl을 바꾼다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
<title>test</title>
</head>
<body>
<div id="result"></div>
<script>
httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function () {
if (this.status == 200 && this.readyState == this.DONE) {
document.getElementById("result").innerHTML =
httpRequest.responseText;
}
};
httpRequest.open("GET", "/test.html");
httpRequest.send();
</script>
</body>
</html>

SOP(Same-Origin Policy)

AJAX의 도입이후 프론트엔드 서버와 백엔드 서버를 따로 두어 개발하는 방법이 생겼다.
SOP는 동일 출처 정책으로 동일한 출처의 리소스만 상호작용을 허용하는 정책이다.
두 URL의 프로토콜, 호스트, 포트가 모두 가아야 동일한 출처로 인정되고 웹사이트를 샌드박스화 하여 잠재적인 보안 위협으로부터 보호해주는 정책이다.

SOP가 존재하지 않을 경우 악의적인 javascript 코드를 만나게 될 경우 해커의 서버로 유저의 정보를 전송할 수 있다. 이러한 경우를 사전에 방지하기 위해 SOP가 존재한다.

CORS(Cross-Origin Resource Sharing)

어쩔 수 없이 다른 출처간의 상호작용을 해야하는 경우도 존재한다.
CORS는 SOP의 예외 정책이다.

service.example.com에서 api.example.com으로 요청을 할 경우 HTTP 패킷을 통해 service.example.com의 프로토콜, 호스트, 포트 정보가 Origin 헤더를 통해 전송된다.

서ㅓ는Origin 헤더를 통해 요청이 전송된 사이트 정보를 알 수 있다.

1
2
3
4
5
6
7
8
GET /api/v1/test HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: https://service.example.com

서버에서는 Access-Control-Allow-Origin 헤더를 통해서 응답한다.

1
2
3
4
5
6
7
8
9
10
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml

[…Data…]

SOP 우회시 발생할 수 있는 취약점

CORS 적용이 어려운 경우 curl이나 HttpUrlConnection,urllib,requests 등의 HTTP 모듈을 통해 서버에서 직접 응답값을 가져오도록 구현하는 경우가 있다. 이 경우 파라매터 검증에 더욱 신경을 써야한다.
요청을 변조할 수 있기 때문에 Command Injection 또는 SSRF(Server-side Request Forgery) 취약점이 발생할 수 있다.

ref

이해하기 쉬운 웹 보안 모델 이야기 1(SOP, CORS)

Ajax 시작하기

댓글