Lighttpd와 Cross-Origin Resource Sharing와 Access-Control-Allow-Origin

2021. 1. 13. 17:50Programming/Server

반응형

Cross-Origin Resource Sharing와 Access-Control-Allow-Origin

우선 CORS에 대해서는 CORS, Cross-Origin Resource Sharing - MDN Web Docs 페이지를 읽어보도록하자. 예를 들어 A서버에서 제공하는 웹 서비스에서 B서버의 리소스를 요청하면, 엥? 나 A에서 제공하고 있는 서비스인데, 너한테 뭐 좀 요청해도 되니?하고 B서버에게 물어본다는 얘기다.

이렇게 B서버에게 요청을 보낸 뒤 돌아온 응답 헤더에 Access-Control-Allow-Origin값을 보고 사용자한테 요청을 할지 말지 알려주게되는데, 웹을 만지다보면 프론트건 백엔드건 한번쯤 겪게되는 문제다.

간단하게 말하면 서버단에서 응답 헤더에 Access-Control-Allow-Origin:*을 추가하면 해결되는 문제지만, 모든 요청을 다 허락하는건 보안상의 문제가 있을 소지가 있으니 주소나 HTTP 메소드 등으로 제한을 걸어주는게 바람직하다.

이 글에서는 아마 지금은 쓸 일이 거의 없지 싶은 lighttpd에서, 설정 파일을 통해 응답에 Access-Control-Allow-Origin를 추가하는 방법이다.

모듈 추가

우선 mod_setenv 모듈을 추가해주도록하자. 이 모듈은 요청 헤더, 응답 헤더, 혹은 CGI의 환경변수를 수정하는 모듈이다. 앞에서 서버의 응답 헤더에 Access-Control-Allow-Origin를 추가해준다고 했는데, 응답 헤더를 수정하기 위해서 이 모듈이 반드시 필요하다. lighttpd의 mode_setenv 모듈에 대해서는 Redmine mode_setenv Docs 페이지를 참고하도록 하자.

mod_setenv 모듈을 추가한 다음에는 아래와 같은 방법으로 서버의 응답 헤더를 수정할 수 있다.

setenv.add-response-header = ("My-Custom-Header" => "my-custom-value")

이렇게 전역에 선언하게되면, 서버가 응답할 때마다 헤더의 My-Custom-Header 필드에 my-custom-value 값을 할당해서 반환한다. 즉, 아래와 같이 요청하면 모든 요청에 대한 응답에 Access-Control-Allow-Origin 필드를 추가해줄 수 있다.

setenv.add-response-header = ("Access-Control-Allow-Origin" => "*")

뭐, 모든 요청에 대한 응답에 Access-Control-Allow-Origin필드를 설정해주는 건 자원 낭비가 아니냐구? 맞는 말이다. 아래와 같이 처리하면 특정 URL에 대해서만 응답 헤더를 수정해줄 수 있다. Redmine mode_setenv Docs의 하단에 나와있는 예제코드이다.

 $HTTP["url"] =~ "^/abc/def/" {
    setenv.set-response-header = var.response_header_policy
    setenv.set-response-header+= ("Access-Control-Allow-Origin" => "*")
}

lighttpd 설정 문법에 대해선 Redmine Configuration Docs 페이지를 참조하도록 하자. 위의 설정은 URL주소가 "^/abc/def/" 패턴에 매칭될 경우에만, 응답 헤더에 Access-Control-Allow-Origin:*을 추가한다. 와! 간단!

2021년에 lighttpd 서버를 쓸 일은 없겠지만, 다른 서버에서 CORS를 처리하는 방법은 비슷하니 큰 문제없이 해결할 수 있을 것이다. :)

반응형