[태그:] 쿠키 보안 설정

  • FastAPI 쿠키 SameSite 설정: HttpOnly, Secure까지 한 번에 정리

    FastAPI를 활용하여 웹 애플리케이션에서 쿠키를 설정하는 방법과 보안 속성을 이해하는 것은 매우 중요합니다. 이 글에서는 FastAPI에서 쿠키를 설정하는 기본 코드와 함께, 보안 강화를 위한 다양한 속성들을 살펴보겠습니다.

    FastAPI에서 쿠키 설정하기

    FastAPI에서는 Response 객체를 사용하여 쿠키를 설정할 수 있습니다. 아래는 로그인 후 쿠키를 설정하는 기본 코드 예시입니다:

    from fastapi import FastAPI, Response
    
    app = FastAPI()
    
    @app.post("/login")
    def login(response: Response):
        response.set_cookie(
            key="session",
            value="session-token-value",
            max_age=3600,
            httponly=True,
            secure=True,
            samesite="lax",
        )
        return {"message": "logged in"}
    

    이 코드는 사용자가 로그인할 때 세션 쿠키를 설정하는 방법을 보여줍니다. max_age는 쿠키의 수명을 초 단위로 설정하며, httponly, secure, samesite는 각각 보안 속성을 강화하는 데 사용됩니다.

    Starlette 문서 기준으로 set_cookie의 기본값은 httponly=False, secure=False, samesite="lax"입니다. 즉 HttpOnly와 Secure는 따로 켜지 않으면 적용되지 않으므로 직접 지정해야 합니다.

    HttpOnly 속성의 이해

    HttpOnly 속성은 자바스크립트가 Document.cookie를 통해 쿠키에 접근하지 못하도록 막아줍니다. 이는 XSS(크로스 사이트 스크립팅) 공격을 방지하는 데 유용합니다. 그러나 자바스크립트가 시작한 XMLHttpRequest나 fetch 요청에는 여전히 쿠키가 전송될 수 있습니다.

    FastAPI 쿠키 SameSite 옵션의 차이

    SameSite 속성은 쿠키가 교차 사이트 요청에 포함될지를 제어합니다. 각 옵션의 차이는 다음과 같습니다:

    • Strict: 같은 사이트에서 시작된 요청에만 쿠키를 전송합니다.
    • Lax: 같은 사이트 요청에는 전송하고, 교차 사이트 요청은 최상위 탐색(주소 이동)이면서 안전한 메서드를 쓸 때만 전송합니다. POST, PUT, DELETE는 제외됩니다.
    • None: 모든 요청에 쿠키를 전송하며, 이 경우 Secure 속성도 반드시 설정해야 합니다.

    Secure 속성과 localhost 환경

    Secure 속성은 HTTPS 스킴으로 요청할 때만 쿠키를 서버에 전송합니다. 이는 중간자 공격(MITM)을 방지하는 데 유용합니다. http: 사이트에서는 Secure 속성이 붙은 쿠키를 설정할 수 없지만, localhost에서는 이 https 요구가 적용되지 않습니다. 그래서 로컬 개발 중에도 같은 코드를 그대로 쓸 수 있습니다.

    쿠키 만료 설정

    쿠키의 만료는 Max-Age와 Expires 속성을 통해 설정할 수 있습니다. Max-Age는 초 단위로 쿠키의 수명을 설정하며, Expires는 HTTP-date 형식으로 만료 시점을 지정합니다. 두 속성이 모두 설정되면 Max-Age가 우선합니다.

    프론트엔드와 백엔드 도메인 차이

    프론트엔드와 백엔드가 다른 도메인을 사용할 경우, SameSite=None을 설정하여 교차 사이트 요청에 쿠키를 전송할 수 있습니다. 이때 Secure 속성도 함께 설정해야 합니다.

    로그아웃 시 쿠키 삭제하기

    로그아웃 시에는 아래와 같이 delete_cookie 메서드를 사용하여 쿠키를 삭제할 수 있습니다:

    @app.post("/logout")
    def logout(response: Response):
        response.delete_cookie(key="session", path="/")
        return {"message": "logged out"}
    

    쿠키 보안 설정 체크리스트

    • HttpOnly 속성을 사용하여 XSS 공격을 방지합니다.
    • Secure 속성을 사용하여 HTTPS를 통해서만 쿠키를 전송합니다.
    • SameSite 속성을 적절히 설정하여 CSRF 공격을 방지합니다.
    • Max-Age와 Expires를 통해 쿠키의 수명을 관리합니다.
    • localhost에서는 Secure의 https 요구가 적용되지 않지만, 실제 배포 환경에서는 HTTPS를 사용합니다.

    이 정보를 통해 FastAPI에서 쿠키를 안전하게 관리하는 방법을 이해하고 구현할 수 있습니다.

    FAQ

    Q1: FastAPI에서 쿠키를 어떻게 설정하나요?
    FastAPI에서는 Response 객체의 set_cookie 메서드를 사용하여 쿠키를 설정할 수 있습니다. 쿠키의 키, 값, 만료 시간, 보안 속성을 지정할 수 있습니다.

    Q2: HttpOnly 속성은 어떤 역할을 하나요?
    HttpOnly 속성은 자바스크립트가 쿠키에 접근하지 못하도록 하여 XSS 공격을 방지합니다. 하지만 자바스크립트가 시작한 요청에는 쿠키가 전송될 수 있습니다.

    Q3: Secure 속성은 언제 사용해야 하나요?
    Secure 속성은 HTTPS를 통해서만 쿠키를 전송하도록 하여 보안을 강화합니다. 실제 배포 환경에서는 HTTPS를 사용하는 것이 중요합니다.

    관련 글