티스토리 뷰

반응형

 

동작 원리 - 응답 헤더 설정 상세

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

반응형
댓글
반응형
Recent Post.
Recent Reply.
Thanks for comming.
오늘은
명이 방문했어요
어제는
명이 방문했어요