-
2021.11.25 기록장글또 2021. 11. 24. 20:52
ToDo
- cs 50 https://www.edwith.org/cs50/lecture/22797/?isDesc=false
- 책 읽기
- 콰츠 공부
Done
- cors
Weekly goal
- 책 읽기
- 영어 레퍼런스 읽기
- 북마크 읽기, 정리
CORS
과거 프로젝트할 때도 만났던 문제를 회사에서 만나게 되었다.
일단 cors를 간단하게 설명하자면 다른 도메인으로 요청을 보낼 때 발생한다.
요청에도 여러 종류가 있는데 단순 요청과 프리플라이트 요청이 있다.
프리 플라이트 요청은 단순 요청에 위배될 경우 발생하는데 진짜 요청 전에 OPTIONS 메서드를 통한 요청이 한 번 더 가는 것이다.
프리플라이트를 통해 어느 오리진을 허용하는지, 어느 메서드를 허용하는지 등을 알 수 있다.
자 여기까지가 기본 지식이라면 서버 입장인 spring에서는 어떻게 적용해줘야 할까?
간단하게 config를 통해 특정 오리진을 열어줄 수 있다.
근데 막상 인터셉터를 설정하고 header를 검사하니 null 이 나온다. 전에도 만났던 문제다.로컬에서 돌리고 있기 때문에 다른 도메인으로 요청을 보낼 시 프리플라이트가 먼저 나가서 options가 null이 나오는 것.
여기서 true로 보내지 않는다면 다음에 올 진짜 리퀘스트가 오지 않을 것이다.
근데 왜 실 서버에서는 프리플라이트가 나가지 않을까?
앞에서도 말했듯이 회사는 프론트와 서버가 같은 도메인에 올라가 있기 때문에 나가지 않는 것이다.
인터셉터에서 저렇게 구현을 했는데 실제 보안을 할 때는 스프링 시큐리티를 많이 사용한다.
그럼 시큐리티는 어떻게 처리하고 있을까?OncePerRequestFilter를 상속받기에 doFilter 말고 Internal을 오버 라이딩한다.
여기서도 보듯이 프리플라이트일 경우 return으로 다시 내보낼 뿐이다. 물론 valid검사를 진행한다.cors config에 리퀘스트 오리진이 포함되는지 메서드가 포함되는지 등을 판단해서 리스폰스에 담아준다.
그럼 리스폰스를 보고 브라우저가 판단하는 것이다.
우리도 똑똑한 스프링 개발자가 만들어 놓은 것처럼 인터셉터를 구현하면 된다. 물론 시큐리티를 사용하면 그럴 일은 자주 없겠지만..
또한 OPTIONS메서드는 멱등성이 보장되기에 safe 한 메서드이다. 그래서 많이 받아도 문제가 되지 않는다.
아아
가끔 spring config 설정에서 allowmethod를 전부 허용해준다는 것은 들어오는 메서드를 허용해준다는 뜻이지
인터셉터를 프리패스 한다는 뜻이 아니다.https://evan-moon.github.io/2020/05/21/about-cors/
'글또' 카테고리의 다른 글
사이드 프로젝트 - Enum converter (0) 2022.01.23 Atdd [인수 테스트 -1 ]피드백 (0) 2022.01.22 issue-tracker 피드백 (0) 2021.06.27 airbnb 피드백 (0) 2021.06.07 baseball 피드백 (0) 2021.05.17