[서비스] url이 유효한지 판단하는 방법

Seungyeon Choi·2021년 4월 26일
0

TodayILearned

목록 보기
1/3

문제 상황

외부 api에 붙어서 데이터를 가져온 후 연동시키는 작업

외부 url이 유효한지 판단하는 방법

자바에서는 HttpURLConnection 을 이용해서 http 통신을 할 수 있다. url이 유효한지 판단하려면 일단 이 HttpURLConnection 을 이용해서 리퀘스트를 날려봐야한다.

리퀘스트를 날리기만 하면, 옳다/그르다 response가 온다고 보장할 수 있을까?

아니다.
url은 유효하지만, 지원하지 않는 method로 요청하면 405 error가 발생한다.

'무조건' 응답이 넘어온다고 보장하는 방법은 무엇일까?

우리는 그 답을 표준(Method - rfc2616)에서 찾을 수 있다.

The list of methods allowed by a resource can be specified in an Allow header field (section 14.7). The return code of the response always notifies the client whether a method is currently allowed on a resource, since the set of allowed methods can change dynamically. An origin server SHOULD return the status code 405 (Method Not Allowed) if the method is known by the origin server but not allowed for the requested resource, and 501 (Not Implemented) if the method is unrecognized or not implemented by the origin server. The methods GET and HEAD MUST be supported by all general-purpose servers. All other methods are OPTIONAL; however, if the above methods are implemented, they MUST be implemented with the same semantics as those specified in section 9.

http 표준에 따르면 general-purpose server 들은 GET, HEAD 요청을 무조건 지원해주어야 한다. 여기서 당장 api에 붙어서 데이터를 가져올 건지, 후처리로 가져올 건지에 따라 2가지 선택지를 취할 수 있다.

1) 당장 api에 붙어서 데이터를 가져와야하는 경우

  • url로 GET request 날리기

2) 데이터 가져오는 작업은 후처리로 넘기고, url이 유효한지 판단하기만 하면 되는 경우

  • url로 HEAD - rfc2616 request 날리기
  • HEAD는 GET 요청과 동일하게 동작하나, 바디는 전달되지 않음.

만약 url은 유효하지만, general-purpose server가 아닌 경우(표준을 지키지 않은)를 찾아낼 수 있을까?

이 문제의 답도 표준에 있다.

처음에 언급했듯이 url은 유효하지만, 요청한 method를 지원하지 않는다면 무조건 405 error 를 내려준다.

405 error가 따라붙는 표준을 살펴보자. 헤더 필더 중 ALLOW 정의에 따르면

The Allow entity-header field lists the set of methods supported by the resource identified by the Request-URI. The purpose of this field is strictly to inform the recipient of valid methods associated with the resource. An Allow header field MUST be present in a 405 (Method Not Allowed) response.
Example of use:
Allow: GET, HEAD, PUT

405 status가 반환될 때는 헤더에 Allow 필드가 무조건 포함되어야 한다. 이 필드는 그 uri가 가리키는 resource를 지원하는 method들을 알려준다. 즉, 이 필드를 이용해서 유효한 url 이지만 그저 표준을 지키지 않은 것인지 판단할 수 있다.

[예시(간략히)]
HEAD request -> 405 status response(allow: GET)

  • HEAD 는 지원을 안하지만, GET은 지원하는걸 보아 유효하군.

이 모든 표준을 지키지 않는다면?

어쩔도리가 없다. 표준을 지키지 않은 대상을 보정해주는 것이 얼마 만큼 가치있는지 먼저 판단해보자.

profile
캘린더 만드는 개발자입니당

0개의 댓글