포럼
XpressEngine 에서 HTTP Request 보안에 관해
2016.03.13 17:31
안녕하세요. XE 를 예전부터 많이 사용해 온 사람입니다. 너무 프레임워크에 의존하는 것보다, 제가 XE 같은 CMS 를 직접 만들어보면 어떨까 하고
Node.js 로 만들기 시작한 지 한 3주 정도 흘렀네요. XE 처럼 모듈식으로 게시판, 페이지, 회원 등 핵심적인 것만 간단하게 만들었습니다. 이제 샘플 홈페이지만 만들어 놓으면 되는데요 - 궁금한 것이 있습니다.
XE 에서 각종 HTTP 요청들 있잖아요. GET 요청은 크게 상관 없겠고, POST, DELETE, PUT 등 요청을 받을 때 보안을 어떻게 하는지 궁금합니다. 예를 들어서 특정 게시판을 삭제하는 DELETE 요청이 있다고 해 봅시다. 정상적이라면 admin 화면에서 게시판을 삭제해아 하지만, 알다시피 외부에서도 얼마든지 DELETE 요청을 보낼 수 있습니다. 파이썬이든, 자바든 활용해서 말이죠.
/admin/delete/board 라는 주소로 특정 게시판 mid 값을 데이터로해서 DELETE 요청을 보내면, 게시판을 삭제하게 된다고 쳐 봅시다.
외부에서의 요청을 막기 위해 어떤 식으로 코드를 짜야할까요? 예를 들어서 지금 제 게시판 삭제 코드는 클라이언트에서 이렇게 되어 있습니다.
$('.btn-delete').click(function(){
var confirm = prompt('게시판을 삭제하면 연결된 모든 게시물, 댓글, 첨부파일이 같이 삭제됩니다. 삭제하려는 게시판의 mid 값을 입력해 주세요.');
if (confirm == $(this).attr('id')) {
$.ajax({
url: location.href+"/delete/"+$(this).attr('id'),
type: "DELETE",
success: function (data) {
if (data) {
alert(data);
location.reload();
}
}
});
} else {
alert('게시판의 mid 값이 일치하지 않습니다.');
return false;
}
})
게시판 mid 값을 입력해야 삭제하는 것은 뭐 그냥 일련의 실수 방지책이고, 어쨌든간에 저 주소로 delete 요청만 보내면 게시판이 삭제될 것 같습니다. 게시판이 삭제되면 연결된 문서, 댓글, 자료 모두 삭제될텐데. 이 경우 서버 쪽에서 보안을 어떻게 해야할까요? 제가 생각하기엔 요청을 보낸 아이디를 검증해야 할 것 같은데, req.user.id == 'admin' ? 이런 식으로 해서 조건에 부합하지 않으면 처리하지 않는 것이 방법인가요? 모든 라우터에 이런 식으로 처리를 해야하나요? XE 는 오래되어서 보안도 그만큼 철저할 것 같은데, 어차피 PHP 로 개발하든 Node.js 로 개발하든 기본적인 구조는 같을 것 같습니다. XE 는 어떤식으로 이런 외부 HTTP 요청을 방지할까요?
댓글 2
-
YJSoft
2016.03.13 18:02
-
Flolida
2016.03.13 20:42
답변 정말 감사합니다. form 태그가 있는 특정 페이지에 접근할 때, hidden input 에 csrf token 을 집어넣고, 그 form 이 제출될 때의 csrf token 과 현재 session 이나 cookie 의 token 을 비교하는건가 싶네요. 잘 이해한건지 모르겠네요. 관련 npm module 도 있네요. https://github.com/expressjs/csurf 감사합니다. 많은 도움이 되었습니다.
XE에선 리퍼러를 체크해서 리퍼러가 동일 도메인이 아니면 중단하고 있습니다. 하지만 보통은 요청에 CSRF 토큰을 추가하는 방식을 이용합니다.
주로 페이지를 불러올 때 CSRF 토큰을 생성하고, 요청을 보낼때 같이 보내면 서버에서 받을 때 생성된 토큰과 비교하는 방식입니다. 정상적인 절차를 거치지 않는다면(즉 권한이 없어 요청 자체가 생성되지 않는다면) CSRF 토큰도 없거나 만료된 것일테니 효과가 없겠죠.
그리고 XE는 오래되서 보안에 철저한게 아니라 오히려 오래되서 보안에 취약합니다. 계속해서 보안패치가 나오고 있는 것도, 버전업하면서 호환성이 깨지는 것도 구조 자체가 보안에 취약해서 그렇습니다. 많이 없앴지만 아직 PHP4시절 코드가 많이 남아 있고, CSRF 체크도 도메인만 일치하면 통과시켜 버려서(그나마 무조건 POST 제한을 걸어 버려서 큰 문제는 없게 했습니다만) 그동안 여러차례 취약점이 나온 것도 이것 때문입니다.