최근 몇 주 동안 해당 해결 못했던 이슈를 해결하게 되어 잊지 않고자 글을 작성해본다.
브라우저에서는 현재 접속한 도메인 외에 다른 도메인으로 XMLHttpRequest 요청을 보내는 것을 기본적으로 막고 있다. 가장 주요한 이유로는 현재 사이트에 접속한 사용자의 의도와는 다르게 또는 사용자 몰래, 사용자가 인지하지 못한 다른 서버로 사용자의 데이터를 보낼 수 있기 때문이다. 서버와 달리 웹 클라이언트는 브라우 저상에서 코드가 노출되기 때문에 얼마든지 변조가 가능하다(Uglyfy 라이브러리를 통해 난독화할 경우는 제외하고!). CORS에 대한 자세한 내용은 다음을 참고하자.
https://developer.mozilla.org/ko/docs/Web/HTTP/Access_control_CORS
현재 다니고 있는 회사의 서비스 구조는 MSA 아키텍처를 따라 구성되어 있고, Vue 기반 웹 클라이언트에서는 axios 라이브러리를 통해, 클라이언트 이벤트마다 각 서비스 서버에 등록된 API를 호출하고 있다.
이슈가 발생했던 상황은 자동로그인 기능이었다. 자동 로그인을 클릭하고 로그인을 하면 쿠키가 브라우저에 저장이 되어야 하는데 저장이 되질 않았고, API 응답에는 쿠키가 포함되지 않았다. 개발서버에서 테스트를 했을 때는 아무런 문제가 없었던 기능이 운영 서버에 배포를 했더니 동작을 안 하는 문제가 발생했었다.
이러한 이슈가 일주일 넘게 지속되었고, 자동로그인 기능이 동작하지 않는 것은 빼곤 모든 서비스는 정상 동작했기 때문에 서비스를 운영하는 데 있어서 큰 이슈는 없었다(자동 로그인 에러 로그만 모니터링 서버에 잔뜩 쌓여갔다 ㅜ).
개발 서버와 운영 서버 모두 동일하게 CORS 설정이 되어있었고, 터미널에서 직접 curl 명령어를 통해 서버로 API를 요청하면, 해당 요청의 응답 값에 쿠키값이 포함된것을 확인했었다. 혹시나 해서 CORS 설정값 중 하나인 Access Aollow Origin 값을 변경해보기도 했지만, 결론은 똑같았다. 서버 프로그램은 CORS 설정이 똑같았고 직접 API를 호출했을 때 쿠키가 정상적을, 클라이언트 개발자분을 호출하여 같이 이슈를 확인했고 쿠키가 안 넘어오는 이유는 다음과 같았다.
Credentials 옵션을 true로 설정하면, CORS 환경에서 Http Request 헤더에 쿠키 필드를 사용하는 것을 허용하고, 이를 false로 설정하거나, 설정을 안했을시 쿠키 필드는 응답 값으로 넘어오지 않았다.
이는 CORS Authentication 문제로 인증 관련 데이터는 인증된 응답임을 증명하는 Credentials 플래그를 설정해야 인증 데이터가 클라이언트로 넘어오게 된다. withCredentials 또는 CORS에서 Credentials 옵션 플래그를 활성화하면 CORS
요청 허용 도메인을 뜻하는 Access-control-allow-origin 값을 * 와 같은 와일드카드로 설정할 수 없으며, 명확하게 허용할 도메인명을 저장해야한다.
개발 당시에 클라이언트 개발자 분과 협의하여 credentials 값을 true로 지정했었는데, 클라이언트 개발자분이 개발 과정에서 인증 이슈가 있어 잠시 false로 지정했던 것이 운영서버에 반영이 되어버려 자동 로그인 기능이 먹통이 되었던 것이다.
[ 서버와 클라이언트 모두 Credentials 플래그를 설정한 모습 ]
CORS 문제에 관해서는 몇 번 다뤄봤기 때문에 자신이 있었는데, 감도 안 왔던 문제로 인해 일주일의 시간을 날렸다. 이번 경험을 토대로 좀 더 공부해야겠다는 생각이 들었다.
'Programming > Server' 카테고리의 다른 글
[ELK] AWS Elastic Load Balancer Log 분석하고 대시보드 만들기[2] (0) | 2020.01.03 |
---|---|
[ELK] AWS Elastic Load Balancer Log 분석하고 대시보드 만들기[1] (0) | 2019.11.06 |
[DevOps] 로그 수집 및 모니터링 시스템 - Sentry (2탄) (1) | 2019.06.25 |
DataCommunication - 9장 (0) | 2017.05.10 |
DataCommunication - 7장 (0) | 2017.05.10 |