티스토리 뷰
동작 원리 - 응답 헤더 설정 상세
Cross-site Origin 요청에서는 헤더에 'Origin: protocol://domain:port'이 서버로 전송된다.
Same Origin이라도 GET, HEAD 요청을 제외한 메서드는 Origin 헤더가 추가되며,
mode 설정에 따라 요청에 사용 가능한 헤더가 제한될 수 있다.
즉 Same Origin이어도 CORS 요청으로 취급될 수 있어 유의해야 한다.
So, what the spec means there is: The Origin header is sent in all cross-origin requests, but it’s also always sent for all POST, PUT, PATCH, and DELETE requests — even for same-origin POST, PUT, PATCH, and DELETE requests (which by definition in Fetch are actually “CORS requests” — even though they’re same-origin).*
이전 글의 <동작 원리 (1) - 기본>에 설명된 것처럼 응답 헤더에 Access-Control-Allow-Origin이 반환된다.
웹 브라우저는 이 반환받은 헤더를 토대로 리소스에 대한 권한을 검사하고, 허용되는 경우에만 데이터에 접근한다.
아래에 작성된 것 외에 다양한 방법이 있으니 참고 부탁드린다.
Node.js
🔲 응답 헤더 추가
가장 간단하게 설정할 수 있는 방법이다.
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*"); // 모두 허용
res.header("Access-Control-Allow-Origin", "https://www.example.com"); // 허용할 주소
});
🔲 CORS 모듈 사용
Node에서 지원하는 cors 모듈을 사용하는 방법이다.
responseHeader 객체에 각각 origin, credentials와 같은 key에 해당하는 value를 작성해준다.
const cors = require("cors");
const app = express();
const responseHeader = {
origin: "http://www.example.com", // Access-Control-Allow-Origin을 설정하여 www.example.com을 접근 허용
credentials: true, // Access-Control-Allow-Credentials를 추가한다.
// Credential mode를 Include로 설정하여 Origin이 *이 될 수 없고 이 헤더가 없으면 데이터 반환을 못하게 된다.
};
app.use(cors(responseHeader));
ASP.NET
🔲 Web.config
Web.config 파일에 사용자 정의 헤더를 선언하여 name과 value를 작성한다.
<system.webServer>
<!-- 중략... -->
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="허용할 주소" />
</customHeaders>
</httpProtocol>
<system.webServer>
🔲 Global.asax.cs (ASP.NET)
해당 파일은 Application_Start 이벤트를 정의하는 파일로,
웹 애플리케이션 시작 후 요청을 수행할 때 CORS 헤더를 응답할 수 있도록 하는 방법이다.
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
/* 애플리케이션 시작 시 설정할 무언가.. */
}
// 아래 함수를 추가
protected void Application_BeginRequest()
{
HttpContext.Current.Response.AddHeader
(name: "Access-Control-Allow-Origin", value: "허용할 주소");
}
}
JAVA
🔲 CORS Filter 사용
web.xml에 모든 경로에 대해 CORS 필터를 매핑하고,
간단히 Access-Control-Allow-Origin 응답 헤더를 설정하는 방법이다.
- web.xml
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.project.filter.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- CORSFilter.java
단 아래 방법은 Origin 값을 그대로 허용하게 만든다.
보안성을 위해서는 허용할 url의 화이트리스트를 배열로 선언해서,
요청 url이 화이트리스트 배열 안의 item과 일치하는지 검증하는 과정이 필요할 것이다.
@Component
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
chain.doFilter(req, res);
}
// init과 destroy
}
🔲 Spring CrossOrigin 어노테이션 사용
해당 어노테이션이 달린 메서드에서 Cross-Site Origin을 허용하는 방법이다.
최상위 컨트롤러에 매핑할 경우 모든 경로의 요청에 적용된다.
@CrossOrigin(origin="*", allowedHeaders = "*")
@Controller
public class Controller {
@GetMapping(path = "/")
public String main(Model model) {
// ...
}
}
다음은 어떤 CORS 구성이 보안에 취약한지, 대응방안은 무엇이 있는지 알아보고
실습 문제 풀이도 해보는 것이 계획이다.
1-1 ~ 1-3 게시글 참고자료
https://www.bugbountyclub.com/pentestgym/view/60
https://ko.wikipedia.org/wiki/XMLHttpRequest
https://www.bugbountyclub.com/pentestgym/view/40#CORS
https://stackoverflow.com/questions/46808011/how-to-set-the-origin-request-header
https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
https://core-research-team.github.io/2021-04-01/Easy-to-understand-Web-security-model-story-1%28SOP,-CORS%29
https://www.jeong-min.com/30-cors-fe/
https://gareen.tistory.com/66
https://velog.io/@rhqjatn2398/Access-Control-Allow-Credentials
https://www.youtube.com/watch?v=bW31xiNB8Nc
'WEB&APP 진단 > CORS' 카테고리의 다른 글
2-1. 취약한 CORS 유형 (1) - 반사된 ACAO 및 True ACAC (0) | 2024.02.18 |
---|---|
1-5. CORS - Credentialed Request (0) | 2024.02.17 |
1-4. CORS - Simple Request vs Preflighted Request (1) | 2024.02.15 |
1-2. Request 소스코드를 통한 CORS 동작 원리 (XHR) (1) | 2024.02.14 |
1-1. CORS 개념과 Origin에 대해 (0) | 2024.02.13 |
- Thanks for comming.
- 오늘은
- 명이 방문했어요
- 어제는
- 명이 방문했어요