본문 바로가기

HTML & CSS

HTML img 태그 탐구: Content-Type 없이도 이미지가 렌더링되는 이유

Vue/HTML img 태그 탐구: Content-Type 없이도 이미지가 렌더링되는 이유

1. 상황 소개

최근 프로젝트를 분석하면서, 프론트엔드에서 이미지를 다루는 방식에 대해 흥미로운 점을 발견했습니다. DB 테이블에 IMG_URL 컬럼이 있었고, 업로드된 파일과 연결되어 있습니다. 서버에서는 파일 ID를 기반으로 이미지를 가져오는 API(localhost:8080/api/image/{fileId})를 제공하고 있고, 그 API의 URL을 파일 업로드 시에 IMG_URL에 저장하여.이미지를 불러올 때는 해당 URL만 불러오면 되도록 구성되어 있었습니다.

흥미로운 점: 브라우저에서 해당 API를 직접 열면 이상한 문자가 나열되지만, <img> 태그에서 사용하면 정상 이미지로 표시됩니다. 해당 API는 ResponseEntity<byte[]>만 반환하며, Content-Type 헤더는 없습니다.

2. img 태그의 기능과 비밀

HTML의 <img> 태그는 브라우저에게 이미지를 가져와 화면에 렌더링하라고 지시하는 요소입니다.

  1. 이미지 URL 요청: <img src="URL">로 브라우저가 GET 요청
  2. 데이터 이미지 해석: Content-Type 없이도 브라우저는 데이터의 바이너리 구조를 분석하여 PNG, JPEG 등으로 판단
  3. 화면에 렌더링: 바이트 데이터를 이미지로 표시

즉, <img> 태그는 단순 URL 요청 이상의 스마트 뷰어 역할을 수행합니다.

3. 서버 API를 주소창에서 열면 이상한 문자가 보이는 이유

주소창에서 API를 열면 브라우저는 데이터를 텍스트로 처리하려고 합니다.

  • 텍스트 뷰어 → byte[]를 문자열로 변환 → 의미 없는 문자 출력
  • <img> → 바이트 배열을 이미지로 해석 → 정상 렌더링

즉, 같은 데이터라도 해석 방식에 따라 결과가 달라집니다.

4. Vue에서 활용 예시

<template>
  <div>
    <img :src="imageUrl" alt="업로드 이미지" />
  </div>
</template>

<script>
export default {
data() {
return {
imageUrl: "http://localhost:8080/api90/image/1234"
};
}
}
</script>

Vue에서는 :src 바인딩으로 동적 URL 처리 가능. 서버가 byte[]만 반환해도 이미지로 렌더링됨.

5. 결론

  1. <img>는 데이터를 이미지로 해석
  2. 서버가 byte[]만 반환해도 정상 렌더링
  3. 주소창과 <img> 태그에서 결과 차이 → 브라우저 해석 방식 차이

개발자는 서버가 반환하는 데이터 구조를 이해하고, <img>가 데이터를 어떻게 처리하는지 아는 것이 중요합니다. 서버가 보내는 데이터와 브라우저가 이를 처리하는 방식을 이해하면서, 단순 바이트 배열만으로도 이미지가 표시된다는 것을 깨달을 수 있었습니다.