[python] Tornado를 활용한 로그인 보안 강화

목차

개요

Tornado는 Python으로 작성된 비동기 웹 프레임워크로 많은 개발자들이 사용하고 있습니다. 이 프레임워크를 활용하여 웹 애플리케이션을 개발할 때, 로그인 보안은 매우 중요한 부분입니다.

이 글에서는 Tornado를 활용하여 로그인 보안을 강화하는 방법에 대해 소개하겠습니다.

문제점

일반적으로 Tornado에서 제공하는 로그인 기능은 간단한 형태로 구현되어 있습니다. 하지만 이런 간단한 로그인 기능은 보안에 취약할 수 있습니다. 몇 가지 주요한 문제점은 다음과 같습니다.

  1. 비밀번호 저장: 기본적으로 Tornado는 비밀번호를 평문 그대로 저장합니다. 이는 해커에게 쉽게 공격당할 수 있는 취약점입니다.
  2. 세션 관리: Tornado의 세션 관리 기능도 간단한 형태로 구현되어 있어 보안에 취약할 수 있습니다.
  3. CSRF 공격: Tornado에서는 기본적으로 CSRF(Cross-Site Request Forgery) 공격을 방어하기 위한 기능을 제공하지 않습니다.

보안 강화 방법

Tornado를 활용하여 로그인 보안을 강화하기 위해 다음과 같은 방법을 사용할 수 있습니다.

  1. 암호화된 비밀번호 저장: 로그인 시 입력받은 비밀번호를 해싱 알고리즘인 bcrypt 등을 사용하여 암호화하여 저장합니다. 이를 통해 해커가 비밀번호를 쉽게 알아낼 수 없게 됩니다.
  2. 세션 관리 기능 강화: Tornado의 세션 관리 기능을 사용하는 대신, 클라이언트의 요청과 응답에 대한 세션 정보를 서버에서 직접 관리하도록 구현합니다. 이렇게 함으로써 세션 관리에 대한 보안을 강화할 수 있습니다.
  3. CSRF 공격 방어: Tornado에서 제공하는 RequestHandler 클래스를 상속받아 CSRF 공격 방어 기능을 추가합니다. 이를 통해 악의적인 요청이 사이트 내부에서 일어나는 것을 방지할 수 있습니다.

구현 예시

아래는 Tornado를 사용하여 보안 강화된 로그인 시스템을 구현하는 예시입니다.

import tornado.web
import bcrypt

class LoginHandler(tornado.web.RequestHandler):
    def post(self):
        # 폼에서 입력받은 비밀번호를 암호화하여 저장
        password = self.get_argument('password')
        hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())

        # 로그인 세션 관리
        self.set_secure_cookie('user_id', str(user_id))

class CSRFHandler(tornado.web.RequestHandler):
    def get(self):
        # CSRF 토큰 생성 및 세션에 저장
        csrf_token = self.xsrf_token
        self.set_secure_cookie('csrf_token', csrf_token)
        
    def post(self):
        # CSRF 토큰 검증
        csrf_token = self.get_argument('csrf_token')
        if csrf_token != self.get_secure_cookie('csrf_token'):
            raise tornado.web.HTTPError(403)

application = tornado.web.Application([
    ('/login', LoginHandler),
    ('/csrf', CSRFHandler),
    # ...
], cookie_secret='SECRET_KEY')

위의 예시에서는 bcrypt 패키지를 사용하여 비밀번호를 암호화하고, set_secure_cookie 메서드를 통해 로그인 세션을 관리합니다. 또한, xsrf_token 속성을 이용하여 CSRF 토큰을 생성하고 검증하는 방식으로 CSRF 공격을 방어합니다.

참고 자료