게시글

5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
강좌4 - HTTP - 6년 전 등록

알아둬야 할 HTTP 응답 헤더

안녕하세요. 이번 시간에는 HTTP 응답 헤더들에 대해 알아보겠습니다. 지난 시간의 공통 헤더 & 요청 헤더 강좌와 이어집니다.

응답 헤더

Access-Control-Allow-Origin

프론트엔드 개발자들에게 악명 높은 헤더입니다. 요청을 보내는 프론트 주소와 받는 백엔드 주소가 다르면 CORS 에러가 발생하는데요. 이 때 서버에서 응답 메시지 Access-Control-Allow-Origin 헤더에 프론트 주소를 적어주어야 에러가 나지 않습니다.

Access-Control-Allow-Origin: www.zerocho.com
Access-Control-Allow-Origin: *

프로토콜, 서브도메인, 도메인, 포트 중 하나만 달라도 CORS 에러가 나서 슬픕니다. 만약 주소를 일일이 지정하기 싫다면 *으로 모든 주소에 CORS 요청을 허용하면 됩니다. 단 그만큼 보안이 취약해집니다.

유사한 헤더로 Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Headers 등이 있습니다. Request랑 Allow에서 Method 단수 복수 주의하세요!

CORS 요청 시에는 미리 OPTIONS 주소로 서버가 CORS를 허용하는지 물어봅니다. 이 때 Access-Control-Request-Method로 실제로 보내고자 하는 메서드를 알리고, Access-Control-Request-Headers로 실제로 보내고자 하는 헤더들을 알립니다. Allow 친구들은 Request에 대응되는 애들로, 서버가 허용하는 메서드와 헤더를 응답하는데 사용됩니다. Request랑 Allow가 일치하면 CORS 요청이 이루어지는 것이죠.

Allow

Allow 헤더는 Access-Control-Allow-Methods랑 비슷하지만, CORS 요청 외에도 적용된다는 데에 차이가 있습니다. 즉 GET www.zerocho.com은 되고, POST www.zerocho.com은 허용하지 않는 경우, 405 Method Not Allowed 에러를 응답하면서 헤더로

Allow: GET

를 같이 보내면 됩니다. GET 요청만 받겠다는 뜻입니다.

Content-Disposition

응답 본문을 브라우저가 어떻게 표시해야 할지 알려주는 헤더입니다. inline인 경우 웹페이지 화면에 표시되고, attachment인 경우 다운로드됩니다.

Content-Disposition: inline
Content-Disposition: attachment; filename='filename.csv'

다운로드되길 원하는 파일은 attachment로 값을 설정하고, filename 옵션으로 파일명까지 지정해줄 수 있습니다. 파일용 서버인 경우 이 태그를 자주 사용하게 될 것입니다.

Location

300번대 응답이나 201 Created 응답일 때 어느 페이지로 이동할지를 알려주는 헤더입니다.

HTTP/1.1 302 Found
Location: /

이런 응답이 왔다면 브라우저는 / 주소로 리다이렉트합니다.

Content-Security-Policy

다른 외부 파일들을 불러오는 경우, 차단할 소스와 불러올 소스를 여기에 명시할 수 있습니다. 하나의 웹 페이지는 다양한 외부 소스들을 불러옵니다. 이미지도 불러오고 script 태그로 자바스크립트 파일들도 불러옵니다. 폰트나 스타일, 아이프레임도 불러오고요. 하지만 해커들에 의해 원하지 않는 파일을 불러오게 될 수도 있습니다. 악성 코드가 담겨져있는 파일이라면 큰 일이 나겠죠. XSS 공격 같은 것이 하나의 예시입니다. 이럴 때 Content-Security-Policy로 허용할 외부 소스만 지정할 수 있습니다.

Content-Security-Policy: default-src 'self'
Content-Security-Policy: default-src https:
Content-Security-Policy: default-src 'none'

self로 지정하면 자신의 도메인의 파일들만 가져올 수 있습니다. www.zerocho.com에서는 www.zerocho.com/logo.jpg를 가져올 수 있지만, www.nero.com/logo.jpg는 못 가져오는 것이죠. https:로 지정하면 https를 통해서만 파일을 가져올 수 있게 됩니다. 'none'으로 지정하면 가져올 수 없습니다.

default-src는 모든 외부 소스에 대해 적용되는 것이고요. 각각 따로 지정할 수도 있습니다. 두 개나 세 개 정도만 추려서 지정할 수도 있고요.

Content-Security-Policy: font-src 'self'; script-src https://www.zerocho.com 'unsafe-inline'; img-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'

font-src, script-src, img-src, style-src, object-src 등이 있고, 소스 옵션으로는 도메인이나, https:, 'unsafe-inline'(인라인 태그 허용), 'unsafe-eval'(eval 함수 허용) 등이 있습니다. 옵션들이 매우 많으므로 자세한 내용은 여기 서 참고하세요!

이 외에도 다양한 응답 헤더들이 있으나, 자주 보이는 것만 추려보았습니다. 혹시나 궁금한 다른 헤더가 있다면 댓글을 남겨주세요. 다음 시간에는 쿠키&캐시 헤더들을 알아보겠습니다! Cache-Control, Cookie, Set-Cookie, Expires, ETag 등의 헤더입니다.

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

4개의 댓글이 있습니다.
4년 전
질문이있습니다~

CRA없이 webpack-dev-server 프론트환경에서
로컬의 host가 다른 api backend서버로와의 ajax통신과정에서

ㅡㅡㅡㅡㅡㅡㅡㅡ
await fetch(`http://www.apibackend.test/token_detail`, {
mode: 'no-cors',
credentials: 'include',
headers: {
Authorization: `Bearer ${token}`
}
});
ㅡㅡㅡㅡㅡㅡㅡㅡ

위 코드가를 실행했을때, backend서버쪽에서 로그를 찍어보면, Authorization 헤더가
찍히지 않습니다 (크롬 브라우저에서 Request Headers에도 Authorization 헤더가 포함되지 않더라고요)

조언부탁드려요
4년 전
안녕하세요! 제로초님. 좋은 글 항상 잘보고 있습니다!! 두 가지 질문이 있어서요.

1. Allow헤더는 설명주신 것처럼 Access-Control-Allow-Methods헤더와 매우 비슷한거 같은데,
"CORS 요청 외에도 적용된다는 데에 차이가 있습니다" 이 부분이 어떤 경우인지 이해가 잘 안가서요!
이 말에 의미가
서버와 클라가 same origin?일때, 즉 Cors에 위배되지 않는 요청인데, 요청메소드가 서버에서 허용하는 메소드와 다를 경우에 Allow헤더를 서버가 보내고,
그리고 Cors에 위배되는 요청(주소와 요청메소드가 다를때)일 경우는 Access-Control-Allow-Methods헤더와 함게 Allow헤더도 보낸다는 의미인가요??
2. 지금까지 공통헤더, 요청헤더, 응답헤더를 설명해주셨는데
공통헤더는 요청헤더, 응답헤더 모두에 포함된 헤더인건가요?? 공통헤더에서 설명하신 Content 헤더는 서버에서 보내는 응답헤더인것 같은데, 요청헤더에도 포함되는 건가 싶어서요!
4년 전
1. 네, Allow는 cors 여부와 상관 없이 모든 요청에 적용됩니다.
2. 공통헤더는 요청/응답 모두 포함입니다. 요청의 경우 Content는 요청의 Body에 대한 정보가 담겨있습니다.
4년 전
답변 감사합니다!!
6년 전
오타신고: 서브도메인만 \u003c\u003c달라고>> CORS 에러가 나서 슬픕니다. 만약 주소를 일일이 지정하기 싫다면 *으로 모든 주소에 CORS 요청을 허용하면 됩니다. 단 그만큼 보안이 취약해집니다.
-----------------------------------------------------------------------
=> 혹시 \u003c\u003c달라고>> 오타 아닌가요? "달라고" => "달라도" 인듯하여 댓글달았습니다.
6년 전
수정했습니다 감사합니다!
6년 전
When do you upload vue.js?
6년 전
When vue@3 comes out. Never know when that will be.