빗썸 테크 아카데미/TIL

5일차

민철킹 2021. 8. 25. 13:39

후.... 오늘 강의는 영상 소리가 진짜 아예 안들려서 설명을 아무것도 듣지못했다. 사실 거의 커리큘럼 상 거의 훑듯이 지나가기 때문에 소리 들려도 어차피 나혼자 키워드 잡고 따로 공부해야하는 건 마찬가지긴 하지만 ㅋㅋ

 

오늘은 그래서 아예 키워드만 잡고 혼자 공부하려함. 

 

Design Pattern

 

 


@CrossOrigin

 

이 애노테이션에 대해 이야기하려면 먼저 CORS에 대해 알고넘어가야한다.

 

CORSCross-Origin Resource Sharing의 약자로써 추가적인 HTTP header를 사용해 애플리케이션이 다른 origin의 리소스에 접근할 수 있도록하는 메커니즘을 뜻하는데 다른 origin에서 내 리소스에 접근하지 못하기 위해 사용된다.

 

여기서 origin(출처)가 뜻하는 의미는 다음과 같다.만약 Protocal, Host, Port가 동일하다면 그것은 같은 출처이다. 하지만 하나라도 다르다면 다른 출처!

 

예를 들어, https://naver.com과 http://naver.com은 다른 출처이다. 하나는 https 프로토콜, 하나는 http 프로토콜을 사용하기 때문이다. 같은 논리로 https://naver.com과 http://naver.com:81은 다른 출처이다.https는 기본적으로 port를 생략하면 80번 port를 사용하는데 뒤의 출처는 81번 port를 사용하기 때문이다.

 

다른 출처에서 접근을 막는 동일 출처 정책(SOP)을 지킨다면 XSS, XSRF 등의 보안 취약점에 대한 공격을 방어할 수 있다.하지만 이는 나 또한 외부 리소스를 가져오지 못하는 불편함이 생기는데 이를 위한 예외 조항이 바로 CORS이다.

 

CORS의 동작 방식에는 단순 요청 방법예비 요청을 먼저 보내는 2가지 방법이 존재한다.브라우저가 리소스를 요청할 때 추가적인 헤더에 정보를 담는다. 내 출처, HTTP 메소드, 어떤 요청, 어떤 헤더들을 포함할 것인지를 담아 서버로 전송하고 서버는 서버가 응답할 수 있는 출처를 헤더에 담아 브라우저로 다시 반환 브라우저는 이를 보고 해당 출처에서 요청이 가능하다면 리소스 전송을 허용하고 불가능하다면 에러를 발생시킨다.CORS에 대한 기본적인 설명은 이정도로 마무리하고 다시 처음으로 돌아가자.

 

SpringCORS를 위한 @CrossOrigin이라는 애노테이션을 제공한다.

https://www.baeldung.com/spring-cors단순히 Controller에 적용시켜 특정 url로 접속할 때만 CORS를 적용할 수도 WebMvcConfigurer를 구현한 Config 클래스를 만들어 글로벌 설정으로 적용시킬 수도 있다.

 

위와 같이 따로 옵션을 지정하지 않으면 모든 origin을 허용하고, HTTP 메서드는 위의 코드에서는 GET만 허용하며 실행 전 응답이 캐시되는 최대 시간은 30분으로 설정된다.

이와 같이 글로벌 설정으로 적용시킬 수 있는데 설명하자면 localhost:3000, localhost:8080을 허용하고 HTTP CookieHTTP Authentication 정보를 인식할 수 있게 해주는 Credentials를 허용한다는 의미이다.

origin은 애노테이션에서 {}안에 배열형식으로 여러개를 나열할 수도, CorsRegistry를 사용해 등록시킬 수도 있다.

 


Swagger2

 

Swagger는 API 문서와 코드와의 변경 사항을 관리해주는 유용한 라이브러리이다. 

나또한 Swagger를 사용해 API 문서를 만들어 본적이 있는데 @Api, @ApiOperation을 사용해 Swagger에 보여질 내용을 설정할 수 있었다.

 

여기서 좀 더 업그레이드(?)버전이라고 할 수 있겠다. 그 중에서도 Swagger2의 구현체인 Springfox를 사용해 이런 부분을 자동화할 수 있다.

implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'

라이브러리를 추가하고 Config 클래스를 만들어 @Configuration과 @EnableSwagger2를 붙혀 Spring Boot에 Swagger2를 통합해준다.

그 후 서버를 띄우고 http://localhost:8080/swagger-ui.html로 접속하면 위와 같은 API 문서가 자동으로 생성되어 있는 것을 확인할 수 있다. 또한 흔히 Postman을 사용하는 것처럼 서버로 요청또한 전송해볼 수 있는데,

Try it out 버튼을 클릭해 파라미터를 설정하고 요청을 전송할 수 있고 응답을 받을 수 있다.

 

실제 응답

문서만 제공하고 save나 delete와 같이 애플리케이션에 영향을 줄 수 있는 url에 대한 요청을 막고 싶다면 try-it버튼을 비활성화 할 수도 있으니 참고하자.

 

이는 각 컨트롤러 레벨에서 원하는 정보를 입력하거나 모델에 입력해 개발자의 입맛에 맞게 API 문서를 자동화하여 만들 수 있다.

 

다시 Config 클래스로 돌아가 Docket에 대해 알아보자. Docket은 Swagger 설정의 핵심이 되는 Bean이다.

참고로 Docket은 Bean단위로 여러개 만들어 버전관리를 할 수 있다.

즉, Docker을 두개 만들어 API문서 버전 1, API문서 버전 2와 같이 만들 수 있다는 의미. 

이를 위해서는 groupName()을 사용해 각 Docker Bean의 충돌을 막아줘야한다.

 

이제 위의 코드를 자세히 알아보자.

  • select() : ApiSelectorBuilder를 생성한다.
  • apis() : RequestMapping이 선언된 API를 문서화한다.(basepackage로 컨트롤러가 존재하는 패키지를 지정할 수도있다. 현재는 any기 때문에 모든 컨트롤러
  • paths() : apis()로 선택된 API 중 특정 path조건에 맞는 API들을 필터링해 문서화하는데 여기서는 /error를 제외하였다.
  • apiInfo() : 제목, 설명 등 문서에 대한 정보들을 보여주기 위해 호출

  • 위와 같이 별도로 apiInfo를 만들어주었다. 
  • useDefaultResponseMessage() : 불필요한 응답 코드와 메시지를 제거하기 위하여 사용하는데 false로 설정하면 swagger에서 제공하는 응답코드(200, 401, 403, 404 등)에 대한 기본 메시지를 제거해준다. 컨트롤러에서 명시하여 아래와 같이 사용한다.

controller

  • 위와 같이 불필요한 메시지를 제거하고 custom하게 설정해줄 수 있다.
  • securitySchemes, securityContexts : api 토큰이나 jwt 같은 것들을 api에서 미리 인증할 수 있도록 도와준다.
  • tags() : 태그 설정
  • genericModelSubstitutes() : 제네릭 클래스를 파라미터로 들어온 타입으로 대체해준다.(사실 잘 이해안감

 

이 부분은 나중에 API 문서를 만들어보면서 다시 보면 이해가 잘 될듯하다.

반응형

'빗썸 테크 아카데미 > TIL' 카테고리의 다른 글

7일차  (0) 2021.08.29
6일차  (0) 2021.08.27
4일차  (0) 2021.08.24
3일차  (0) 2021.08.20
2일차  (0) 2021.08.20