2021. 1. 13. 17:50ㆍProgramming/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를 처리하는 방법은 비슷하니 큰 문제없이 해결할 수 있을 것이다. :)
'Programming > Server' 카테고리의 다른 글
NGINX에서 TLSv1, TLSv1.1을 비활성화해보자. (0) | 2022.12.20 |
---|---|
OpenResty/NGINX의 크로스 컴파일 (0) | 2021.12.21 |
Spawn-fcgi의 크로스 컴파일 (0) | 2020.05.08 |
nginx에서 flask로의 proxy pass (reverse proxy) (0) | 2019.11.20 |
[lighttpd] TLSv1.0, TLSv1.1 비활성화하기 (TLSv1.2 Only) (0) | 2019.08.22 |