화면에 그리는 내용을 서버가 아닌 브라우저에서 처리하는 방식.
HTTP (stateless 때문에)
사용자 정보를 알리기 위해 쿠키에 sessionId를 함께 실어 보냄.
세션은 서버에서 관리하고, 쿠키로 세션 정보를 주고 받음
서버사이드 라우팅 | 클라이언트 라우팅 |
---|---|
요청받는 URL에 따라 리소스 반환 | URL의 변화에 따라 화면상태를 변경 |
URL 받아 웹 페이지를 반환 | |
리다이렉트시 서버요청 있음 | 서버요청 없음 |
1. 상황
하나의 web application은 여러개의 호스트와 다양한 리소스에 접근하게됨.
사용자를 악의적인 행위에서 보호하기 위해
브라우저는 동일 출처에서만 리소스 접근을 허용하도록 함.
따라서 다양한 리소스에 접근하게 해주는게 CORS
👿 악의적인 상황이란?
1. 내가 A 사이트에 로그인하면 브라우저에 ID등 세션정보(토큰)를 쿠키에 저장함
2. 그 상황에서 우연히 특정 악성 사이트에 접근하게된다.
3. 악성사이트는 브라우저에게 시켜 내 쿠키를 읽어 토큰을 갈취함
4. 악성사이트에서 A 사이트에 내 세션 토큰으로 요청해 로그인하고 나쁜짓함
2. SOP와 CORS
Same Origin(동일한 출처): 프로토콜, 호스트,포트가 동일한 경우.
동일출처가 아닐 때 에러발생
-> SOP(same Origin Policy)가 막음.
-> CORS가 이를 해결
CORS: http 헤더를 이용해서 application의 다른 출처 리소스에 접근하게 하는 메커니즘.
-> 어떤 기준을 충족시키면 리소스 공유가 되도록 함.
3.CORS 흐름
예비요청(preflight)을 보내냐에 따라 CORS 흐름이 달라짐.
단순요청이 아닐때는 예비요청을 보냄
단순요청의 경우: 단순요청의 기준들을 모두 만족하는 경우
예비요청이 있는 경우
예비요청이 없는 경우
4. CORS 지원방식
CORS 방식 1. 프론트엔드의 프록시 이용
CORS 방식 2. 스프링 서버 전역적으로 CORS 설정
<static class AppConfig implements WebMvcConfigurer, ApplicationContextAware {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedMethods("GET", "POST") //메소드 지정 가능
.allowedOrigins("*"); //전체 다 허락
}
}
CORS 방식 3. 특정 컨트롤러나 메소드에 개별적 CORS 설정
@Controller
//특정 컨트롤러에만 CORS 적용하고 싶을때.
@CrossOrigin(origins = "*", methods = RequestMethod.GET)
public class customController {
@GetMapping("/url")
//특정 메소드에만 CORS 적용 가능
@CrossOrigin(origins = "*", methods = RequestMethod.GET)
@ResponseBody
public List< > findAll(){
return service.getAll();
}
}
** 도메인과 DTO