SOP란?
- Same-Origin Policy, 동일 출처 정책
- 두 Origin 간에 프로토콜, 포트, 호스트가 같아야 동일 Origin이라고 할 수 있다.
- http://www.heowc.com/user에서 http://www.heowc.com 호출시 성공
- https://www.heowc.com/user에서 http://www.heowc.com 호출 실패( 프로토콜이 다름 )
- http://www.heowc.com:8080에서 http://www.heowc.com 호출 실패(포트가 다름)
- http://blog.heowc.com에서 http://www.heowc.com 호출 실패(호스트가 다름)
CORS (Cross-Origin Resource Sharing)
- 웹 서버 도메인간 액세스 제어 기능을 제공하여 보안 도메인간 데이터 전송을 가능하게 해준다.
- SOP는 지난 2011년, RFC 6454에서 처음 등장한 보안 정책으로 말 그대로
같은 출처에서만 리소스를 공유할 수 있다
라는 규칙을 가진 정책이다.- 하지만… 무조껀 막을 수도 없으니 몇 가지 예외 조항을 두고 출처가 다르더라도 허용하기로 했는데, 그 중 하나가 CORS 정책을 지킨 리소스 요청이다
이런 개념이 왜 등장한걸까..?
즉 우리가 다른 출처로 리소스를 요청한다면 SOP 정책을 위반한 것이 되고,
CORS 정책같은 조항을 지키지 않는다면 아예 다른 출처의 리소스를 사용할 수 없게 되는 것이다.
- 출처가 다른 두 개의 어플리케이션이 마음대로 소통할 수 있는 환경은 꽤 위험한 환경이다.
- 일단 웹에서 동작되는 클라이언트 어플리케이션 사용자 공격에 굉장히 취약하다.
- 브라우저의 개발자 도구만 열어도… DOM, 서버 통신 전부 알 수 있다…
CSRF(Cross-Site Request Forgery)
- 사이트 간 요청 위조
- 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.
XSS(Cross-Site Scripting)
- 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점
- 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다.
- 일단 웹에서 동작되는 클라이언트 어플리케이션 사용자 공격에 굉장히 취약하다.
SpringBoot에서 CORS 활용하기
- 우선, 서버에서는 브라우저에 다음과 같은 키를 header에 보내줘야 한다.
- Access-Control-Allow-Orgin
- 요청을 보내는 페이지의 출처 (*, 도메인)
- Access-Control-Allow-Methods
- 요청을 허용하는 메소드 (Default : GET, POST, HEAD)
- Access-Control-Max-Age
- 클라이언트에서 pre-flight의 요청 결과를 저장할 시간 지정. 해당 시간 동안은 pre-flight를 다시 요청하지 않는다.
- Access-Control-Allow-Headers
- 요청을 허용하는 헤더
- Access-Control-Allow-Orgin
- 방법1: 각기 컨트롤러에 @CrossOrigin 붙이기
방법2: 글로벌하게 적용하기
1 2 3 4 5 6 7 8 9 10 11 12 13
@Bean public WebMvcConfigurer webMvcConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/message/**") .allowedOrigins("*") .allowedMethods(HttpMethod.POST.name()) .allowCredentials(false) .maxAge(3600); } }; }
- 방법3: 간단하게 Properties로 적용
- management.endpoints.web.cors.allowed-origins=http://other-domain.com
- management.endpoints.web.cors.allowed-methods=GET,POST