사용자가 로그인 요청을 보낸 후, 결과(성공/실패)에 따라 적절히 다른 페이지로 이동하도록 API를 작성하던 중 다음과 같은 질문이 생겼습니다.
사용자가 로그인에 성공하면 '/', 실패하면 '/login/error' 페이지로 이동한다고 가정해봅시다.
아래의 방법 중 어떤 방법을 이용해야 될까요?
(1). HTTP status를 3xx로 응답하고, redirect url 을 헤더에 담아주기
HTTP/1.1 302 FOUND
LOCATION: ~/
(2). (1)과 동일하게 header를 작성한 후, body에도 상태를 담아주기
HTTP/1.1 302 FOUND
LOCATION: ~/
{
code : 302,
redirect_url: '~'
}
(3) HTTP status 200 으로 응답하고, body에만 상태를 담아주기
HTTP/1.1 200 OK
{
code : 3xx,
redirect_url: '~'
}
REST API 응답에 대해 잘 모르고 있다는 것을 알게되었고, 새롭게 공부한 내용들을 정리해보며 위 질문의 답을 골라보겠습니다.
먼저 REST API에서 응답 상태를 어떻게 담아줘야 하는지 고민해봐야 했습니다.
앞서 예시처럼 HTTP status code를 이용하는 방법도 있고, 그냥 body에만 정보를 담아주는 방법도 있었죠.
이에 관해 조사해본 결과, 완벽한 정답은 없고 크게 2가지 경우로 나뉘었습니다.
HTTP status code를 준수하는 경우입니다.
그런데 body의 code와 HTTP status code를 굳이 중복해서 표현해줘야할 필요가 있을까요?
Body 부에 들어가는 code는 보통 직접 정의한 코드로, 사용자가 API 문서를 통해 그 의미를 알 수 있는 것으로 설정한다고 합니다.
이렇게 하면 HTTP status code보다 좀 더 자신의 서비스에 맞게 세분화할 수 있겠죠.
카카오 API는 이 방법을 이용하고 있습니다.
(https://developers.kakao.com/docs/latest/ko/reference/rest-api-reference)
이 방법을 사용하는 데에는 2가지 근거가 있습니다.
우선 status code를 200으로 고정하는 것에는 논란이 조금 있습니다. 적어도 HTTP 프로토콜 표준에 맞지 않게 사용하고 있는 것은 사실입니다.
그런데 HTTP status code가 노출되면 보안에 위험이 될 수 있다고 합니다. 해커가 계속 여러 요청을 시도하면서 예외처리 구조를 파악할 수 있는 느낌인 듯 합니다.
정부 시큐어 코딩 가이드는 이러한 이유로 status code를 200으로 고정하는 방법을 추천한다고 합니다.
물론 이에 대해서도 논란이 많은 듯 합니다.
결국은 선택의 문제가 됩니다.
서비스마다 다른 방법을 사용하기 때문이죠.
그렇지만, 굳이 정부 시큐어 코딩 가이드를 준수해야 하는 경우가 아니라면, (1)번 방법을 사용하는 것을 추천합니다.
앞서 확인할 수 있듯이 (2)번 방법을 이용하더라도 구현에 문제는 없지만 논란의 여지가 있기 때문이죠.
저 또한 현재 구현하고 있는 서비스에서 (1)번 방법을 사용하기로 결정했습니다.
이제 REST API 구축 시 응답을 어떻게 처리해야할지 결정했으니 처음 질문을 해결해보겠습니다.
인증 성공 시,
HTTP1.1 200 Ok
{
code: -200,
redirect_uri: '/'
}
인증 실패 시,
HTTP1.1 401 Unauthorized
{
code: -401,
redirect_uri: '/login/error'
}
와 같이 응답하면 됩니다.
지금와서 보니, 처음 질문에는 답이 없었네요.
먼저 status 부터 살펴보겠습니다.
사용자가 보내는 요청은 '인증' 요청입니다. 이때 300번대 응답을 통해 redirect 하게 하는 것은 '인증'요청에 대한 적절한 응답이 아닙니다.
따라서 이때는 인증이 성공했다는 의미에서 200 OK 상태로 응답하면 됩니다.
(응답 상태를 200으로 고정하는 것이 아니라, 실제로 성공한 경우 200을 사용하는 것입니다.)
만약 인증이 실패하면, 인증 실패라는 의미를 담아 401 로 응답하면 됩니다.
다음으로 body를 살펴보겠습니다.
code는 HTTP status code와 구분하기 위해 음수를 사용했습니다.
예시이므로 별도의 의미는 부여하지 않았고, 서비스에서 정의한 에러코드에 맞게 명시해주면 됩니다.
redirect_uri에는 결과에 따라 이동할 uri가 명시되어 있으므로, 사용자가 이 값을 보고 redirect하면 됩니다.
이번 글에서는 REST API의 응답에 대해서 알아봤습니다.
크게 2가지 방법을 알아보았는데, 각각의 장단점에 대해 고민해보고 선택하시면 되겠습니다.