일개미 : 일상과 개발의 미학

[Spring Security] 보안 관련 CORS 설정 본문

Developments/Spring & SpringBoot

[Spring Security] 보안 관련 CORS 설정

9low_28 2022. 9. 11. 19:24

CORS(Cross-Origin Resource Sharing)란, "교차 출처 리소스 공유"

: 다른 출처의 자원을 공유할 수 있도록 설정하는 권한 체제. 여기서 교차 출처 = 다른 출처를 의미한다. 즉, 브라우저에서 막고 있기 때문에 CORS를 허용해주어야 접근이 가능한기 때문에 CORS를 설정해주지 않거나 제대로 설정하지 않은 경우, 원하는대로 리소스를 공유하지 못하게 된다. 여기서 출처란 '프로토콜://도메인:포트' 를 말한다. 예로는 http://localhost:8080 등의.



지난번 5주차 회고에서의 키워드로 간략하게 알아보았는데 6주차가 되어 미니프로젝트를 진행하면서 로그인/회원가입 기능을 구현하고 나서 좀 더 찾아본 내용으로 자료가 잘 나와있어서 다시 정리해보려 한다.

 

 

[cors에러]

브라우저는 보안상의 이유로 교차 출처 HTTP요청을 제한한다. 이를 해결하기 위해 스프링에서 CORS관련 설정을 해야한다.

물론 프론트에서도 서버 URL을 맞게 입력해야한다.

 


CORS 헤더의 종류

서버가 접근 제어 요청을 위해 보내는 응답 헤더들이다.

 

  • Access-Control-Allow-Origin
    • 서버의 자원에 접근할 수 있는 출처를 명시한다.  (  "*" (와일드카드)로 표기시 어느 출처에서나 사용 가능  )
  • Access-Control-Expose-Headers
    • 브라우저에게 표시할 헤더를 명시한다.  
      • ex)  ABC라는 헤더가 있다고 가정해보자. 이 ABC라는 헤더를 브라우저에서 확인할 수 있도록 하려면 해당 CORS헤더를 사용하여 ABC헤더를 명시해주면 된다.
  • Access-Control-Max-Age
    • preflight 요청 결과를 캐시할 수 있는 시간을 의미한다.

▶︎ preflight 란?

CORS 관련하여 검색을 하다 보면 preflight라는 단어를 자주 보게 된다.

preflight를 해석하면 미리 보내는 것,
즉, 사전 전달이라고 할 수 있는데 뜻을 잘 생각해보면 이해가 쉬울 것 같다.

기본적으로 브라우저는 cross-origin 요청을 전송하기 전에 OPTIONS 메소드로 preflight를 전송한다.
이때, Response로 Access-Control-Allow-Origin과 Access-Control-Allow-Methods가 넘어오는데
이는 서버에서 어떤 origin과 어떤 method를 허용하는지 브라우저에게 알려주는 역할을 한다.

브라우저가 결과를 성공적으로 확인하고 나면 cross-origin 요청을 보내서 그 이후 과정을 진행한다.

 

  • Access-Control-Allow-Credentials
    • 같은 출처에서는 기본적으로 쿠키가 request헤더에 자동으로 설정되지만 CORS는 교차 출처간 통신이기 때문에 자동으로 설정되지 않는다.
    • 응답헤더에 헤더의 속성을 true주면 클라이언트에서 보낸 쿠키를 받을 수 있다.
  • Access-Control-Allow-Method
    • 요청이 허용되는 메소드를 지정한다. (  "*" (와일드카드)로 표기시 어느 메소드라도 사용 가능  )
  • Access-Control-Allow-Headers
    • 서버로 요청 시 사용할 수 있는 헤더를 명시한다.

아래는 웹브라우저가 서버로 요청을 보낼때 사용하는 요청 헤더들이다.

 

  • Origin
    • 출처를 나타낸다.
    • 요청이 시작된 서버의 경로정보는 포함하지 않고, '프로토콜://도메인:포트' 만을 포함한다.
  • Access-Control-Request-Method
    • 어떤 메소드를 사용할지 서버에게 알려준다.
  • Access-Control-Allow-Headers
    • 어떤 헤더를 사용할지 서버에게 알려준다.

 


CORS설정하는 방법은 과거에는 WebConfigurerAdapter을 상속하여 클래스 내에서 configure를 재정의해서 사용했지만  Spring Security 버전 5.7 이후부터는 Bean등록 방식으로 업데이트 되면서부터 CORS 또한 Bean등록으로 작성하면된다.

 

작성시 해당 헤더들을 적절하게 사용해서 각자의 프로젝트에 맞게 세팅해주면 되고,
이걸 이용해 구현한 코드는 따로 6주차 회고에서 작성해서 리뷰해보도록 하겠다.

 


p.s 작성자도 아직 배우는 단계에 있기 때문에 틀렸을지도 모르고 해서 100% 참조하는 것은 권장하지 않는다...