개발자
안녕하세요, 2년차 프론트엔드 개발자입니다. 최근 모회사 프론트엔드 직무 면접을 보던중, cors에 대한 질문을 받았었습니다. 이에 대해 제가 드린 답변은 아래와 같았습니다. "cors는 다른 출처임에도 불구하고 브라우저상에서 서로 상호작용이 가능하도록하는 정책이고, 이를 정석적으로 사용하기위해서는 Backend 서버에서 HTTP 응답 헤더의 Access-Control-Allow-Origin 속성에 Frontend 서버의 origin을 추가해주면 된다. 또한, Frontend단에서 개발간에는 위에서 말한 Backend 서버측에서의 작업없이도 webpack-dev-server의 proxy설정을 사용하면 proxy서버가 Backend 서버의 origin과 동일한 origin에서 상호작용해줌으로써 cors 정책관련 이슈를 우회할 수 있다." 위 답변에 추가로 면접관께서 여쭤보셨던 것은 "개발간에 어쨌든 로컬에서 proxy서버를 띄울텐데, 그 서버가 어떻게 Backend 서버와 같은 origin으로 상호작용할 수 있느냐?" 였는데요, 제대로 된 답변을 드리지 못하고 면접이 끝난 뒤에도 찾아본다고 찾아봤지만 해당 내용에 대해서 명확한 이유를 찾지못하였습니다. 제가 네트워크 지식이 부족해서 기본적인 proxy개념을 이해하지 못하고 있을 수도 있는데요, 혹시 관련 내용에 대해 잘 아시는 분이 계시다면 알려주시면 감사하겠습니다!
답변 3
인기 답변
안녕하세요! webpack-dev-server 자체가 내부적으로 express (node.js) 서버를 구동시키는 것으로 알고 있습니다. 이게 말씀하신 proxy 서버가 되는 것 같구요. 질문자님의 웹이 백엔드 서버로 요청하는 모든게 proxy 서버를 통해서 나가고, 백엔드에서 넘겨주는 응답도 proxy 서버를 통해서 들어올겁니다. CORS를 우회하려면 proxy 서버에서 header 값을 변경해주면 되는거겠죠. 흐름을 표현하자면: 1. 웹에서 백엔드로 요청하는 코드를 실행한다 (하지만, 설정값으로 인해 proxy 서버로 요청이 날라간다) 2. proxy 서버로 요청이 들어온다. (다른 작업을 할수도 있고 안할수도 있음) 요청을 백엔드로 보내준다. 3. 백엔드에서 요청을 처리하고 응답 헤더에 Access-Control-xxx 정보가 포함된 응답을 proxy 서버로 보낸다. 4. proxy 서버는 전달 받은 응답의 헤더 중 Access-Control-xxx 관련 정보를 수정한다. 5. proxy 서버가 수정된 응답을 웹으로 보내준다. 6. 브라우저는 응답의 헤더를 열어보고 CORS 설정이 잘 되어있다고 판단하고 정상 처리한다. 이렇게 될 것 같습니다. 아마 면접관분은 CORS가 어떻게 우회되는지/(작동하는지) 여쭤보시고자 하신 것 같네요. 브라우저에서 자주보는 빨간 CORS 관련 에러 문구는, 브라우저가 HTTP 응답의 헤더 정보를 처리한 결과라고 보시면 됩니다. CORS 관련 문서와 글들을 참고해보시면 좋을 것 같아요. https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS https://ireadyoulearn.info/2021/12/16/bypass-browser-cors-using-a-proxy/ https://github.com/webpack/webpack-dev-server/blob/2b3b7e000f688e086c68ba821ed2edc3cd56a219/lib/Server.js
알사탕
매니아 • 2023년 02월 07일
좋은 글 감사합니다
익명
작성자
2023년 03월 09일
안녕하세요 정현님, 답변이 많이 늦었습니다. 사실 처음엔 답변주신 내용 읽고도 약간은 긴가민가 했었어요. 그러다 근래 업무간 다시 한 번 CORS 이슈를 마주해보니(해결은 어렵지 않았지만) 이번엔 정말 안되겠다 싶어 답변 내용과 알려주신 링크들을 다시 정독하게 됐구, 이제서야 드디어 Proxy 서버의 요청 우회 원리를 제대로 이해하게 됐습니다. 늦었지만 정말 감사드립니다!
인기 답변
보다 정확한 이해를 위해서 저도 답변을 달아보아요. 로컬에서 개발을 위해 설정하는 webpack-dev-server의 proxy 설정은 Access-Control-xxx 류의 응답 헤더를 생성해주는 역할이 아니에요. 브라우저가 cross origin으로 request 하는 상황 자체를 없애주는 역할이에요. 즉 브라우저가 Ajax로 api를 호출할 때 백엔드 서버가 아닌 same origin으로 요청을 해도 webpack-dev-server가 요청을 백엔드서버로 proxy해주는 것으로 이해를 해야 해요. 관련 가이드 : https://joshua1988.github.io/webpack-guide/devtools/webpack-dev-server.html#%ED%94%84%EB%A1%9D%EC%8B%9C-proxy-%EC%84%A4%EC%A0%95 좀 더 정확한 이해를 위해서 실제 서비스의 아키텍처와 로컬환경에서 개발시에 아키텍처를 보면 다음과 같아요. 커리어리가 이미지 업로드가 안되서 아쉽군요. - 실제 서비스 시퀀스 다이어그램 이미지 링크 : https://mermaid.ink/img/pako:eNptklFr2zAUhf_KRU8Jqxf2akYgzvY4AvOrXxT7phGzJVeSl4xSaFgGhXZshabttnh00D2WdqWDPewfSfkPk-00bKx-MJbvp3POhbNLYpEg8YnCnQJ5jM8Y3ZY0izi4hxZa8CIbomzOOZWaxSynXEMAVEEgxUShhKdDCZ0uCMm2GQemoDWSgmvkiefGr1E-jkXWfkAkrFVo_MqhYU3-LzVsxv8qNVqB1-0-CkIfZBVfaWh1aM460-l0bRaEnkO8oCJULrhCmDA9hjHSZJO7F8eolNd3iaVIvV6aiok3qAP48MAijXTz5kIjOHSsQYzA-bQUzfA-vi3vwC7m5vDAXO-bb0voD16GYC8W9sc7e_YR7PlsdfrdlnMwN19sedTerOWUnpjbA4ilUGotV90wR_urxRLs5xN7e2XLc2dxbA5_1kZO9u3MXszs8nflZT58sl-PW71-bwCrs0vz_gTs_LKimrktf60Wd-2_t4k42SIZyoyyxJVit_obET3GDCPiu88ER7RIdUQivufQIk-oxucJ00ISf0RThVukak34hsfE17LAe2hdrA2F9aUXTfvqEu79AQ5wAJE - 로컬 환경에서의 시퀀스 다이어그램 이미지 링크 : https://mermaid.ink/img/pako:eNqVkjFP20AYhv_Kp5tSFTe7VUXC0LFCwkMXLxf7AlbtO_fuTIIQkoFQVTQDQwOhtSsqtepYUzF04BflLv-Bc3wpSG2HerL1ve_7Pa_8HaCQRQS5SJA3OaEh2YzxDsdpQME8OJeM5mmf8PY7w1zGYZxhKsEDLMDjbCgIh-d9Dt0eMB7vxBRiAZ2EhTjZZUI--dP6atNvzEPSz3D42onInmNC9v47x1vGeCaD0Mj_V0K_ndsVz0KWmqg2zHN6vaeGxgXe1BcSOl2cxd3RaGTXmWGj8Ywk42y0vxJav--YqWMTRMaoIBagsx6GRAhng1HJWeKsJwkbOltLrHldgL58O7-p1fEM9Puv-rqEATfKB07bQJd36ksJemw0U3U-0xe3oD-_U2cfQJ8cLU7KR5wNivcA8qiLZVK_Jqq60x9rfV00DLbLYlqCmhQmz-wp1c9xk95a5vWVrooVSzX7yz_T1a36URhIu2Rja9sHA6tvTvXlOejZ0eLim67GoOpP-rspPj3T1SSgaA2lhKc4jsz1HTQtAiR3SUoC5JrXiAxwnsgABfTQSPMswpK8iGLJOHIHOBFkDTXn6e_TELmS52Qlshf8W0WWppftmS-v_fAeb74q2Q
손정현
엔지니어 • 2023년 03월 13일
오! 그렇네요. 다이어그램으로 보니까 한번에 이해가 되는군요. 제가 남긴 답변보다는 이 답변을 참고하시는게 더 좋은 것 같습니다. 감사합니다 :)
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!