Skip to content

http status code 어디서 작성 해야할까 server? client?

http status message는 어디서 정의해야 할까?

서버일까 클라이언트일까?
정답은 없지만, 효율적인 방법은 있다.

서버에서는 status code만 반환하고 메시지는 클라이언트에서 작성하는 게 가장 효율적일 것이다.

하지만 애매할 수가 있다.
401 status 같은 경우 인증 관련 에러 메시지인데 계정이 잘못된 것인지 패스워드가 틀린 것인지
이미 있는 계정인지 클라이언트에서 알 수가 없다.

그래서 아래와 같은 코드가 필요하다


const errors = err.response.data.message;
if (err.response.status === 401) {
    errors = '잘못된 요청입니다. 관리자에게 문의하세요'
}
if (err.response.message === 'wrong password') {
errors = '패스워드가 잘못되었습니다.'
}

서버로부터 메시지가 있을 때 메시지를 표시하고 메시지 내용에 따라 다르게 표시한다.
이 부분은 서버에서 처리해야 한다.

때문에 https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html 에 정의된 status 외에 에러 메시지를 표시하기 위해서는 서버에서 각각 에러 메시지를 보내줘야 한다.

아래는 내가 사용하는 서버용 error code handler다.
내가 만든 건 아니고 어디서 가져온 것 같은데 출처를 모르겠다.
(감사할 뿐이다.)


'use strict';

var status = function(err) {
  switch (err.code) {
    case 'AUTHENTICATION_REQUIRED':
    case 'AUTHENTICATION_INVALID':
    case 'TOKEN_INVALID':
    case 'TOKEN_EXPIRED':
    case 'UNAUTHORIZED':
      return 401;
    case 'NOT_SELF':
    case 'NOT_GROUP_OWNER':
    case 'NOT_GROUP_MANAGER':
    case 'NOT_GROUP_MEMBER':
    case 'NOT_RELATED_TO_GROUP':
    case 'ALREADY_RELATED_TO_GROUP':
    case 'NOT_CARD_OWNER':
    case 'NOT_ALARM_OWNER':
    case 'FORBIDDEN':
      return 403;
    case 'USER_NOT_FOUND':
    case 'GROUP_NOT_FOUND':
    case 'PHOTO_NOT_FOUND':
    case 'CARD_NOT_FOUND':
    case 'API_NOT_FOUND':
      return 404;
    case 'USER_DUPLICATED':
    case 'USER_MISMATCH':
    case 'PASSWORD_MISMATCH':
    case 'TOKEN_MISMATCH':
    case 'NOT_FOR_GROUP_OWNER':
    case 'CARD_ALREADY_RESPONDED':
    case 'CARD_ALREADY_COMPLETED':
      return 409;
    case 'REQUIRED_FIELD':
    case 'INVALID_FIELD':
    case 'REQUIRED_PHOTO':
    case 'REQUIRED_PARAM':
    case 'INVALID_PARAM':
      return 422;
    default:
      console.error(err.stack);
      return 500;
  }
};

exports = module.exports = function errorHandler() {
  /* jshint unused: false */
  return function errorHandler(err, req, res, next) {
    res.status(status(err));

    var error = { message: err.message };
    for (var prop in err) error[prop] = err[prop];
    var json = JSON.stringify({ error: error });
    res.setHeader('Content-Type', 'application/json');
    res.end(json);
  };
};

하지만

이렇게까지 친절하게 메시지를 보여줄 필요가 없으면 아래 표준 status code를 참고해서 보여주면 된다.

https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C#3xx_.28.EB.A6.AC.EB.8B.A4.EC.9D.B4.EB.A0.89.EC.85.98_.EC.99.84.EB.A3.8C.29

추가

http-states 메시지가 잘 정리되어 있고 변경해서 보여주는 플러그인
https://github.com/adaltas/node-http-status

Published inNodeJs