304 Not Modified 상태 코드란? 대역폭 절약 히어로

INEZA Felin-Michel

INEZA Felin-Michel

23 September 2025

304 Not Modified 상태 코드란? 대역폭 절약 히어로

Apidog 엔터프라이즈

온프레미스 배포

SSO & RBAC

SOC 2 준수

Apidog Enterprise 살펴보기

오늘 벌써 세 번째로 즐겨찾는 뉴스 웹사이트를 탐색하고 있습니다. 새로고침을 클릭하면 페이지가 거의 즉시 로드됩니다. 이면에서는 브라우저가 사이트 로고, CSS 스타일시트 또는 JavaScript 파일을 실제로 다시 다운로드하지 않았습니다. 이미 가지고 있었습니다. 브라우저는 서버에 변경 사항이 있는지 확인했고, 서버는 간단한 한 줄 응답을 보냈습니다: 304 Not Modified.

이 작고 효율적인 상태 코드는 웹 성능의 숨겨진 영웅 중 하나입니다. 현대 웹이 빠르고 반응성 있게 느껴지는 이유입니다. 캐싱의 기반이며 매일 수십억 기가바이트의 대역폭을 절약합니다. 언뜻 보기에는 리디렉션이나 오류 코드만큼 흥미롭지 않을 수 있지만, 웹사이트와 API를 더 빠르고 효율적으로 만드는 가장 강력한 도구 중 하나라고 확신합니다.

304는 오류가 아닙니다. 성공적이고 효율적인 확인입니다. 서버는 "이 파일의 최신 버전을 이미 로컬에 저장하고 있습니다. 다시 보낼 필요가 없습니다. 가지고 있는 것을 사용하세요."라고 말하는 방식입니다.

이 블로그 게시물에서는 304 Not Modified가 무엇을 의미하는지, 어떻게 작동하는지, 왜 중요한지, 그리고 개발자가 이를 사용하여 더 빠르고 반응성이 뛰어난 웹사이트와 API를 구축하는 방법을 자세히 살펴보겠습니다. 개발자라면 304가 어떻게 작동하는지 이해하는 것이 빠르고 효율적이며 확장 가능한 애플리케이션을 구축하는 데 중요합니다.

시작하기 전에, 웹 서버나 API가 304 Not Modified와 같은 응답을 어떻게 처리하는지 테스트하고 탐색하고 싶다면, **Apidog를 무료로 다운로드**하세요. Apidog는 HTTP 응답을 탐색하고, 응답을 검증하며, 전문가처럼 백엔드를 최적화하는 데 도움이 되는 강력한 API 테스트 및 문서화 도구입니다. 무엇보다도 무료로 다운로드할 수 있습니다. 오늘 바로 API 최적화를 시작하세요.

button

이제 **HTTP 상태 코드 304 Not Modified**에 대해 자세히 알아보고 왜 그렇게 중요한지 살펴보겠습니다.

문제: 비효율적인 데이터 전송

웹 초창기에는 모든 요청이 동일한 방식으로 작동했습니다.

  1. 브라우저: "/logo.png를 주세요."
  2. 서버: "여기 있습니다!" (200 OK + 전체 이미지 데이터)
  3. 브라우저 (2초 후): "/logo.png를 다시 주세요."
  4. 서버: "여기 다시 있습니다!" (200 OK + 정확히 동일한 이미지 데이터)

이것은 엄청나게 비효율적이었습니다. 동일한 로고, 스타일시트, 스크립트가 단일 사용자를 위해 하루에 수십 번 네트워크를 통해 전송되어 대역폭을 소비하고 페이지 로드를 느리게 했습니다.

이러한 비효율성에 대한 해결책은 두 부분으로 구성된 프로세스입니다: **캐싱**과 **조건부 요청**, 그리고 304 상태 코드가 이 쇼의 주인공입니다.

HTTP 304 Not Modified는 실제로 무엇을 의미하나요?

304 Not Modified 상태 코드는 클라이언트가 이미 로컬 캐시에 최신 버전을 가지고 있기 때문에 서버가 요청된 리소스를 전송할 필요가 없음을 나타내는 리디렉션과 유사한 응답입니다.

본문이 없는 성공 메시지입니다. 서버는 본질적으로 "요청이 성공했습니다. 요청한 리소스는 변경되지 않았습니다. 새로 보낼 것이 없습니다."라고 말하는 것입니다.

다시 말해, 동일한 데이터를 계속해서 전송하여 대역폭을 낭비하는 대신, 서버는 단순히 **경량 확인**으로 응답합니다.

일반적인 304 응답은 놀랍도록 간결합니다.

HTTP/1.1 304 Not ModifiedCache-Control: public, max-age=300ETag: "a3c8d7e1f5g2"Date: Sat, 28 Oct 2023 10:00:00 GMT

무엇이 없는지 눈치채셨나요? **응답 본문**입니다. 이미지 데이터도, CSS도, JSON도 없습니다. 이것이 304를 매우 효율적으로 만드는 이유입니다. 전체 응답은 몇 백 바이트의 헤더에 불과하며, 본문에 있었을 메가바이트의 데이터를 절약합니다.

304는 왜 존재할까요? (간략한 역사)

웹 초창기에는 웹 페이지를 로드할 때마다 브라우저가 HTML, CSS, 이미지, 스크립트 등 모든 것을 처음부터 가져왔습니다. 이는 느리고 비효율적이었습니다.

이를 해결하기 위해 **HTTP는 `Last-Modified` 및 `ETag`와 같은 캐싱 메커니즘을 도입**했습니다. **304 상태 코드**는 다음을 위해 설계되었습니다.

이는 **HTTP/1.1**의 표준이 되었으며 오늘날 웹 성능의 초석으로 남아 있습니다.

304 Not Modified가 중요한 이유

이렇게 생각해 보세요: 사용자가 웹사이트를 방문하거나 API 리소스를 요청할 때마다 전체 콘텐츠를 매번 다운로드하는 것은 느리고 비효율적일 수 있으며, 특히 모바일 사용자나 느린 연결에서는 더욱 그렇습니다. 304 Not Modified를 활용하면 다음과 같습니다.

304가 없으면 캐싱은 비효율적이고 웹사이트는 더 느려질 것입니다.

두 단계의 춤: 캐싱과 304가 함께 작동하는 방법

304는 혼자 작동하지 않습니다. 클라이언트와 서버 간의 우아한 춤의 일부입니다.

1단계: 첫 번째 요청 ("시드" 요청)

브라우저가 리소스를 처음 요청하면 서버는 데이터 (`200 OK`)와 함께 두 가지 중요한 정보를 응답합니다.

ETag (엔티티 태그): 리소스의 현재 버전에 대한 지문과 같은 고유 식별자입니다. 이는 종종 파일 내용의 해시입니다. 파일이 변경되면 ETag도 변경됩니다.

ETag: "a3c8d7e1f5g2"

Last-Modified: 리소스가 마지막으로 변경된 날짜 및 시간입니다.

Last-Modified: Sat, 28 Oct 2023 09:00:00 GMT

브라우저는 리소스 *와* 이 두 유효성 검사기를 캐시에 저장합니다.

2단계: 후속 요청 ("조건부" 요청)

브라우저가 동일한 리소스를 다시 필요로 할 때 (예: 사용자가 동일한 사이트의 다른 페이지를 방문할 때), 무작정 요청하지 않습니다. 저장했던 유효성 검사기를 포함하여 **조건부 요청**을 합니다.

두 가지 방법으로 할 수 있습니다.

`If-None-Match` 헤더 사용 (ETag 포함):

GET /logo.png HTTP/1.1Host: www.example.comIf-None-Match: "a3c8d7e1f5g2"

이 요청은 다음과 같이 말합니다: "현재 ETag가 제가 이미 가지고 있는 (`a3c8d7e1f5g2`) 것과 다를 **경우에만** `/logo.png`를 보내주세요."

`If-Modified-Since` 헤더 사용 (날짜 포함):

GET /logo.png HTTP/1.1Host: www.example.comIf-Modified-Since: Sat, 28 Oct 2023 09:00:00 GMT

이 요청은 다음과 같이 말합니다: "10월 28일 이후로 `/logo.png`가 수정되었을 **경우에만** 보내주세요."

3단계: 서버의 결정

서버는 이 조건부 요청을 받고 리소스를 확인합니다.

이 우아한 핸드셰이크는 데이터가 절대적으로 필요할 때만 전송되도록 보장합니다.

304 응답에서 HTTP 헤더의 역할

304의 마법은 헤더에 있습니다. 두 가지 핵심 요소는 다음과 같습니다.

클라이언트가 `If-Modified-Since` 또는 `If-None-Match`를 보내면 서버는 다음을 확인합니다.

ETag와 Last-Modified는 무엇인가요?

클라이언트는 콘텐츠 변경 여부를 확인하기 위해 반복 요청 시 이 값들을 조건부 헤더로 보냅니다.

304 응답의 일반적인 사용 사례

304 워크플로우 예시

다음은 브라우저와 서버 간의 간략화된 예시입니다.

초기 요청

textGET /styles.css HTTP/1.1 Host: example.com

초기 응답

`textHTTP/1.1 200 OK ETag: "abc123" Last-Modified: Tue, 15 Sep 2025 11:00:00 GMT Content-Type: text/css
/* CSS styles here */`

후속 요청

textGET /styles.css HTTP/1.1 Host: example.com If-None-Match: "abc123" If-Modified-Since: Tue, 15 Sep 2025 11:00:00 GMT

서버 응답 (변경 없음)

textHTTP/1.1 304 Not Modified

서버가 콘텐츠가 변경되지 않았다고 말하기 때문에 브라우저는 캐시된 사본을 사용합니다.

왜 항상 캐시된 콘텐츠만 제공하지 않을까요?

좋은 질문입니다!

클라이언트가 유효성 검사 없이 항상 캐시된 콘텐츠를 사용한다면, 정확성에 필수적인 업데이트나 변경 사항을 놓칠 수 있습니다. 304 메커니즘은 필요할 경우 클라이언트가 업데이트된 리소스를 얻도록 보장하며, 변경 사항이 없는 경우에는 불필요한 전송을 방지합니다.

SEO 및 304 Not Modified

SEO 관점에서 304 응답은 검색 엔진이 사이트를 더 효율적으로 크롤링하는 데 도움이 됩니다. 변경되지 않은 페이지에 대해 "콘텐츠 없음" 응답을 제공하여 대역폭 사용량을 줄이고 크롤링 예산을 개선하여 검색 엔진이 새로운 콘텐츠에 집중할 수 있도록 합니다.

304가 왜 그렇게 중요한가요? 장점

  1. 매우 빠른 로드 시간: 브라우저는 모든 자산을 다시 다운로드할 때까지 기다리지 않고 페이지를 표시할 수 있습니다. 빠른 304 확인 후 즉시 캐시된 버전을 사용할 수 있습니다.
  2. 막대한 대역폭 절약: 이것이 가장 큰 장점입니다. 대용량 본문이 있는 200 대신 304 응답을 제공하면 사용자 및 서버 모두에게 엄청난 양의 네트워크 트래픽을 절약할 수 있습니다.
  3. 서버 부하 감소: 서버는 동일한 파일을 초당 수천 번 디스크에서 읽고 보낼 필요가 없으므로 CPU 주기와 I/O 작업을 절약합니다.
  4. 더 나은 사용자 경험: 더 빠른 웹사이트는 더 행복한 사용자를 만듭니다.
  5. 비용 절감: 대역폭 비용을 지불하는 회사 (클라우드 호스팅 비용 등)의 경우, 데이터 전송을 줄이는 것은 직접적으로 비용을 절감합니다.

304 Not Modified 관련 일반적인 문제

Apidog로 조건부 요청 테스트하기

캐싱 동작을 테스트하는 것은 까다로울 수 있습니다. 특정 헤더를 포함한 요청을 보내고 서버의 응답을 해석해야 합니다. 이를 위한 완벽한 도구는 **Apidog**입니다.

Apidog를 사용하면 다음을 수행할 수 있습니다.

  1. 유효성 검사기 캡처: 리소스에 첫 번째 요청을 보내고 Apidog 인터페이스를 사용하여 200 응답에서 ETagLast-Modified 헤더를 쉽게 확인하고 복사합니다.
  2. 조건부 요청 작성: 동일한 URL로 새 요청을 생성하고 캡처한 값으로 If-None-Match 또는 If-Modified-Since 헤더를 쉽게 추가합니다.
  3. 304 응답 확인: 조건부 요청을 보내고 서버가 본문 없이 304 Not Modified 상태를 반환하는지 확인합니다.
  4. 캐시 무효화 테스트: 서버에서 리소스를 수정하고 (액세스 권한이 있는 경우) 조건부 요청을 반복합니다. 이제 새 데이터와 함께 200 OK를 볼 수 있으며, 이는 캐싱 로직이 작동함을 증명합니다.
  5. 테스트 자동화: Apidog에서 이 프로세스를 자동화하는 테스트 스위트를 구축하여 API의 캐싱 헤더가 항상 올바르게 구성되도록 합니다.
button

Apidog를 사용하면 실제 엣지 케이스를 기다릴 필요 없이 캐싱을 미세 조정할 수 있습니다. 이러한 기능을 활용하려면 Apidog를 무료로 다운로드하세요.

개발자를 위한 모범 사례

서버 측 애플리케이션을 구축하는 경우 304를 활용할 수 있습니다.

  1. 항상 유효성 검사기 전송: 캐시 가능한 리소스 (이미지, CSS, JS, 정적 API 데이터)의 경우, 200 응답에 항상 ETag 또는 Last-Modified 헤더를 포함하십시오.
  2. 조건부 로직 구현: 서버 코드에서 If-None-MatchIf-Modified-Since 헤더를 확인하십시오. 현재 리소스와 일치하면 304로 응답하십시오. 그렇지 않으면 200과 새 데이터로 응답하십시오.
  3. `Cache-Control` 사용: `Cache-Control` 헤더 (예: `max-age=3600`)는 브라우저가 조건부 요청을 할 필요 없이 리소스를 얼마나 오랫동안 최신 상태로 간주할 수 있는지 알려줍니다. 이는 304보다 훨씬 더 효율적입니다.

304 Not Modified 및 RESTful API

REST API에서 304는 클라이언트가 리소스 표현을 캐시하도록 허용함으로써 효율성을 크게 향상시킵니다. 적절한 캐시 처리는 서버 부하를 줄이고 클라이언트 동기화를 가속화합니다.

자주 업데이트되는 리소스를 제공하는 API에서 304 응답을 포함한 조건부 요청은 확장 가능한 성능에 필수적입니다.

웹 브라우저의 304 Not Modified

최신 브라우저는 304에 크게 의존합니다.

304 vs 200: 차이점은 무엇인가요?

두 코드 모두 "성공"을 의미하지만, 차이점은 페이로드에 있습니다.

304는 다음과 같이 말한다고 생각하세요.

"걱정 마세요, 새로운 것은 없습니다. 이미 가지고 있는 것을 계속 사용하세요."

304 vs 200 OK: 언제 무엇을 선택해야 할까요?

적절한 캐시 제어는 클라이언트가 언제 업데이트를 요청하고 언제 캐시된 데이터를 사용해야 하는지 알도록 보장합니다.

결론: 웹의 조용한 일꾼

HTTP 304 Not Modified 상태 코드는 효율적인 디자인의 걸작입니다. 현대 웹을 확장 가능하고 빠르게 만드는 조용하고 숨겨진 일꾼입니다. 클라이언트와 서버가 불필요한 작업을 피하기 위해 협력하는 협력 프로토콜의 힘을 보여줍니다.

304 Not Modified 상태 코드는 404나 500처럼 헤드라인을 장식하지는 않지만, 성능, 캐싱 및 효율성에 필수적입니다. 대역폭 사용량을 줄이고 페이지 로드 속도를 높이며 API를 원활하게 실행합니다.

사용자는 이를 결코 볼 수 없지만, 더 빠르게 로드되는 페이지와 원활한 탐색을 통해 매일 그 이점을 경험합니다. 개발자에게 304 응답에 대한 지원을 이해하고 올바르게 구현하는 것은 모든 웹 자산 최적화의 핵심 기술입니다.

그러므로 다음 번에 페이지가 눈 깜짝할 사이에 로드될 때, 이를 가능하게 한 작은 304 응답을 기억하십시오. 개발자라면 304를 마스터하는 것은 더 빠르고 스마트한 애플리케이션을 구축하는 것을 의미합니다. 304 응답을 구현하고 테스트하는 방법을 이해하면 효율적이고 성능이 뛰어난 웹 애플리케이션 및 API를 구축하는 능력이 향상됩니다.

그리고 기억하십시오, 캐싱 및 리디렉션 동작 테스트는 Apidog를 사용하면 그 어느 때보다 쉽습니다. Apidog는 304 Not Modified와 같은 HTTP 상태 코드를 마스터하는 데 도움이 되도록 설계된 무료의 강력한 도구입니다. 단순히 가정에 의존하지 말고 Apidog로 캐싱을 시뮬레이션하고 검증하십시오.

button

Apidog에서 API 설계-첫 번째 연습

API를 더 쉽게 구축하고 사용하는 방법을 발견하세요