내용

    서버 응답 304 Not Modified

    HTTP 상태 코드 304 (Not Modified) 설명

    HTTP 상태 코드 304는 요청된 리소스가 클라이언트의 마지막 요청 이후 변경되지 않았음을 나타내는 서버의 응답입니다. 이 코드는 데이터 전송을 최적화하기 위해 사용되며, 변경되지 않은 데이터를 다시 전송하는 것을 피할 수 있도록 합니다.

    304 - Not Modified

    주요 특징

    • 정의 및 목적: 304 상태 코드는 클라이언트가 요청한 리소스가 수정되지 않았음을 알립니다. 이는 서버가 클라이언트에게 데이터를 다시 보내지 않도록 하는 데 사용됩니다.
    • 캐싱 메커니즘: 클라이언트는 서버로부터 리소스를 요청할 때, 특정 조건을 통해 해당 리소스가 변경되었는지 확인합니다. 서버는 변경되지 않았을 경우 304 상태 코드를 반환합니다.
    • 서버가 304를 반환하는 조건: 클라이언트가 보내는 If-Modified-Since 또는 If-None-Match 헤더에 따라 리소스의 수정 여부를 판단합니다.

    실제 사용 사례

    이미지 캐싱 예시

    • 브라우저의 캐시 저장: 사용자가 웹사이트를 방문하면 브라우저는 이미지 등의 리소스를 캐시합니다.
    • 재요청 시 동작: 사용자가 동일한 웹페이지를 다시 방문할 경우, 브라우저는 이전에 저장한 캐시를 사용하고, 서버에 304 응답을 요청할 수 있습니다.

    API 사용 예시

    • 리소스 요청 최적화: 클라이언트가 API에 요청을 보낼 때, 304 상태 코드를 통해 서버는 변경되지 않은 데이터를 반복해서 전송하지 않고, 효율적인 데이터 전송이 가능합니다.

    헤더 If-Modified-Since 및 If-None-Match의 예시

    • 헤더 상호작용: 클라이언트가 If-Modified-Since 헤더를 포함하여 요청하면, 서버는 해당 날짜 이후에 리소스가 변경되었는지 확인합니다. If-None-Match 헤더는 이전에 받은 ETag와 비교하여 리소스의 변경 여부를 판단합니다.

    다양한 프로그래밍 언어에서 304 문제 해결하기

    PHP

    • 캐싱 헤더 설정: PHP에서는 header() 함수를 사용하여 적절한 캐싱 헤더를 설정할 수 있습니다.
    • 304 상태 처리 코드 예제:
    <?php
    if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == filemtime('resource.txt')) {
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
    ?>
    

    Python (Flask)

    • 캐싱 설정: Flask에서는 @app.route 데코레이터와 함께 캐싱을 설정할 수 있습니다.
    • 304 상태 확인 코드 예제:
    from flask import Flask, request, abort
    import os
    
    app = Flask(__name__)
    
    @app.route('/resource')
    def resource():
        last_modified = os.path.getmtime('resource.txt')
        if 'If-Modified-Since' in request.headers:
            if request.headers['If-Modified-Since'] == str(last_modified):
                return '', 304
        return 'Resource content', 200
    

    Node.js (Express)

    • 요청 처리: Express에서는 미들웨어를 사용하여 요청을 처리하고 304 상태 코드를 반환할 수 있습니다.
    • If-Modified-Since 헤더 처리 코드 예제:
    const express = require('express');
    const fs = require('fs');
    const app = express();
    
    app.get('/resource', (req, res) => {
        const stats = fs.statSync('resource.txt');
        const lastModified = stats.mtime.toUTCString();
        res.set('Last-Modified', lastModified);
    
        if (req.headers['if-modified-since'] === lastModified) {
            return res.status(304).send();
        }
        res.send('Resource content');
    });
    

    자주 발생하는 오류 및 해결 방법

    • 서버의 잘못된 캐싱 설정: 서버의 캐싱 설정을 검토하여 올바르게 설정되었는지 확인합니다.
    • 요청 헤더 오류: 클라이언트에서 보내는 요청 헤더가 올바른 형식인지 확인합니다.
    • 304 상태 코드 검증 및 디버깅: 브라우저의 개발자 도구를 사용하여 요청 및 응답 헤더를 확인하고, 304 상태 코드가 올바르게 작동하는지 검증합니다.
    문제 원인 해결 방법
    잘못된 캐싱 설정 서버 설정 오류 서버 캐싱 설정 점검
    헤더 오류 잘못된 요청 헤더 요청 헤더 형식 검토
    디버깅 문제 상태 코드 확인 실패 개발자 도구 사용하여 검증