CSRF (Cross-Site Request Forgery)는 웹 애플리케이션의 보안 취약점 중 하나로, 인증된 사용자의 권한을 이용하여 악의적인 요청을 전송하는 공격을 말합니다. Tornado 웹 프레임워크는 이러한 CSRF 공격으로부터 애플리케이션을 보호하기 위한 몇 가지 내장 보호 기능을 제공합니다. 이 글에서는 Tornado에서의 CSRF 보호에 대해서 알아보겠습니다.
1. Tornado에 내장된 CSRF 보호 기능
Tornado에는 웹 프레임워크 자체에서 기본적인 CSRF 보호 기능을 제공합니다. 이 기능을 사용하려면 tornado.web.RequestHandler
클래스를 상속 받은 모든 핸들러에 대해 쿠키를 설정하고 검증하는 로직을 구현해야 합니다. 이를 위해 다음과 같은 단계를 따를 수 있습니다.
- 애플리케이션 설정에
cookie_secret
값을 설정합니다. 이 값은 쿠키에 서명하기 위한 비밀 키로 사용됩니다.
settings = {
"cookie_secret": "my_secret_key"
}
- 핸들러에서
get_csrf_token()
메소드를 오버라이딩하고 쿠키에 CSRF 토큰 값을 설정합니다.
class MyHandler(tornado.web.RequestHandler):
def get_csrf_token(self):
if not self.current_user:
return None
if "_csrf_token" not in self.session:
self.session["_csrf_token"] = base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes)
return self.session["_csrf_token"].decode("utf-8")
- POST 요청을 처리하는 핸들러에서
check_xsrf_cookie()
데코레이터를 사용하여 CSRF 토큰을 확인합니다.
class MyPostHandler(tornado.web.RequestHandler):
@tornado.web.authenticated
@tornado.web.check_xsrf_cookie
def post(self):
# POST 요청 처리 로직
위의 예제에서는 애플리케이션 설정에 cookie_secret
값을 설정하고, 쿠키에 CSRF 토큰 값을 저장하고 검증하는 로직을 구현했습니다. CSRF 토큰은 get_csrf_token()
메소드를 오버라이딩하여 생성하는데, 현재 사용자가 인증되어 있는 경우에만 토큰을 생성하도록 하였습니다. POST 요청을 처리하는 핸들러에서는 check_xsrf_cookie()
데코레이터를 사용하여 CSRF 토큰이 올바른지 검증하고, 검증이 실패하는 경우 tornado.web.HTTPError(403)
를 발생시켜서 접근을 거부할 수 있습니다.
2. 다른 CSRF 보호 기법 사용하기
Tornado의 내장된 CSRF 보호 기능 외에도 다른 보다 고급화된 CSRF 보호 기법을 사용할 수 있습니다. 예를 들어, CSRF 토큰을 쿠키 대신 HTTP 요청의 헤더에 포함시키는 방법이 있습니다. 이를 통해 쿠키를 사용하지 않는 환경에서도 CSRF 보호를 제공할 수 있습니다.
class MyHandler(tornado.web.RequestHandler):
def set_default_headers(self):
self.add_header("X-CSRF-Token", self.xsrf_token)
위의 예제에서는 set_default_headers()
메소드를 오버라이딩하여 X-CSRF-Token
헤더에 CSRF 토큰 값을 설정합니다. 이렇게 설정된 CSRF 토큰은 클라이언트에서 모든 POST 요청에 적용되고, 검증 단계에서 이 헤더 값을 비교하여 CSRF 공격을 방지할 수 있습니다.
마무리
Tornado에서의 CSRF 보호는 웹 애플리케이션의 보안을 강화하는 데 중요한 요소입니다. Tornado의 내장된 CSRF 보호 기능을 사용하거나 고급화된 기법을 적용하여 애플리케이션의 보안을 강화할 수 있습니다. 이를 통해 사용자의 정보와 권한을 보호하고, CSRF 공격에 대비할 수 있습니다.