에브리타임 클론 코딩 프로젝트 정리 - Spring Boot

yshjft·2022년 7월 11일
0

CORS with credentials

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

동일한 문제로 또 고민을 해서 기록한다. ModelAttribute에는 기본 생성자를 넣지 말고 모든 필드에 대한 생성자를 넣자.

참고 자료

객체 내 객체 valid

객체 내부의 객체에서 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;
}

참고 자료

Superbuilder

서브 클래스의 @Builder가 슈퍼 클래스의 @Builder를 상속하면서 오류를 발생시킨적이 있다.

왜 발생?

  • @Builder는 정적 메서드를 통해 빌더 패턴을 구현하는데 정적 메서드는 컴파일 시점에 메모리에 올라가기 때문에 오버라이딩할 수 없다.
  • 또한 슈퍼 클래스에서 빌더의 반환 타입과 자식 클래스에서 빌더의 반환 타입이 다르기 때문에 오버라이딩 할 수 없다.

어떻게 해결?

  • @Builder를 사용하지 않는다.
  • 슈퍼 클래스와 서브 클래스 모두에 @SuperBuilder를 클래스 범위로 적용한다.

참고 자료

profile
꾸준히 나아가자 🐢

0개의 댓글