CORS는 기본적으로 보안상의 이유로 쿠키를 요청으로 보낼 수 없도록 막고 있다. 하지만 다른 도메인을 가진 API 서버에 자신을 인증해야 정상적인 응답을 받을 수 있는 상황에서는 쿠키를 통한 인증이 필요하다. 이때 클라이언트는 withCredentials : true를, 서버의 경우 응답 헤더로 Access-Control-Allow-Crendentials: true를 지정해줘야 쿠키를 요청에 포함할 수 있게된다고 한다.
When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead.
위와 같은 에러를 만났는데 allowCredentials(true)
인 경우 allowedOrigins(“*”)
를 할 수 없다는 내용이다. 해결방법은 특정 주소만 허락하거나, addAllOrigin("*")
대신 allowedOriginPatterns(“*”)
를 사용하면 된다.
Access-Control-Allow-Crendentials: true == allowCredentials(true)
Access-Control-Allow-Credentials: true를 사용하는 경우는 사용자 인증이 필요한 리소스 접근이 필요한 경우인데, 만약 Access-Control-Allow-Origin: *를 허용한다면, CSRF 공격에 매우 취약해져 악의적인 사용자가 인증이 필요한 리소스를 마음대로 접근할 수 있다. 그렇기 때문에 CORS 정책에서 아예 동작하지 않도록 막아버리는 것이라고 한다.
동일한 문제로 또 고민을 해서 기록한다. ModelAttribute에는 기본 생성자를 넣지 말고 모든 필드에 대한 생성자를 넣자.
객체 내부의 객체에서 Bean validation이 필요하다면 객체 내부의 객체에게 @Valid라는 어노테이션을 붙여주면 된다.
public class CustomLectureRequest {
@NotBlank
private String name;
private String professor;
private String classroom;
@Valid
@NotEmpty
private List<CustomLectureDetail> lectureDetails;
}
public class CustomLectureDetail {
@NotNull
private Day day;
@TimeFormatConstraint
private String startTime;
@TimeFormatConstraint
private String endTime;
}
서브 클래스의 @Builder가 슈퍼 클래스의 @Builder를 상속하면서 오류를 발생시킨적이 있다.
@Builder
는 정적 메서드를 통해 빌더 패턴을 구현하는데 정적 메서드는 컴파일 시점에 메모리에 올라가기 때문에 오버라이딩할 수 없다.@Builder
를 사용하지 않는다.