반응형
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
- 요청을 허용하는 헤더
- 방법1: 각기 컨트롤러에 @CrossOrigin 붙이기
- 방법2: 글로벌하게 적용하기
@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
728x90
반응형
'Tech > Spring' 카테고리의 다른 글
ResponseEntity vs @ResponseStatus (0) | 2021.09.12 |
---|---|
Spring Framework에서 자주 쓰는 어노테이션 개념 정리 (0) | 2021.08.08 |
Spring Transactional 어디까지 알고있니? (3) | 2021.08.08 |
SpringBoot를 우아하게(?) 종료시켜보자 (1) | 2021.08.08 |
SpringBoot Test 기본 개념 정리 (0) | 2021.08.08 |