오늘 내용은 쉽다.

 

HTTP status code의 종류와 사용처

 

200번대 - 요청 처리 완료

Successful

 

200, OK

요청이 완료되어 정상적으로 프로세스가 처리되었다. 어떠한 요청이든 처리가 완료되었다면 OK로 응답하여도 좋다.

201, Created

주로 post 요청에 대한 응답 완료로 쓰인다. 요청에 의해 생성된 리소스는 서버에서 관리하게 된다.

서버에서 정해준 location이 응답 header에 추가될 수 있음을 알려준다.

204, No Content

요청에 대한 처리가 완료되었고 응답할 내용이 없다. delete와 put, patch(update) 요청에 응답할 때 사용할 수 있다.


300번대 - 추가 요청이 필요

Redirectional

 

응답에 location 헤더 필드가 존재하면 해당 location으로 자동 이동한다.

리다이렉션은 영구, 일시, 특수로 나눌 수 있다.

 

영구

요청 리소스의 URI가 영구적으로 이동되었으니 응답하는 location으로 요청해라.

해당 URI이 더 이상 지원하지 않을 때 사용된다.

 

301, Moved Permanently

요청 메서드가 무엇이든, GET으로 바뀌고 body가 사라질 수 있다. 많은 경우 body(payload)를 없앤다.

308, Permanent Redirect

요청 메서드와 바디를 유지한다. 보통 영구적으로 URI를 이동(변경)했다는 것은 요청 스펙 또한 바뀌었을 경우가 많다.

따라서 301로 처리하는 경우가 일반적이다.

 

일시

필요, 혹은 강제로 리다이렉션한다.

 

302, Found

요청 메서드가 get으로 변할 수도 있다. 많은 경우, 일시 리다이렉션을 처리할 때 Found를 사용한다.

303 See Other

요청 메서드를 get으로 변경하여 다시 요청하게끔 한다. 역시 found를 사용하는 편이다.

307, Temporary Redirect

요청 메서드와 body를 유지한다.

 

중요! PRG

Post Redirect Get

 

결제시스템에서 중복 결제를 막기 위한 하나의 처리 과정. 의도하지 않은 post 요청이 반복되지 않도록 한다.

결제 post 요청이 처리되면 응답으로 redirect를 보낸다.

중복 결제를 막을 수 있는 안전한 URI를 location에 포함하여 Get으로 유도한다.

새로고침과 같이 사용자가 의도하지 않은 중복 요청을 방지할 수 있다.

 

특수

 

요청한 리소스는 수정되지 않았으니, 저장되어 있는 cache를 사용해도 좋다는 응답이다.

응답에는 body가 포함되어 있지 않다.

 

304, Not Modified

 


400번대 - 요청 오류

Client Error

 

400, Bad Request

서버에서 정상적으로 처리할 수 없는 요청에 대한 응답으로, 통상 BAD REQUEST가 사용된다.

401, Unauthorized

인증되지 않은 사용자의 요청에 대한 응답이다.

403, Forbidden

인가받지 못한 사용자의 요청에 대한 응답이다.

404, Not Found

잘못된 URI로 리소스를 찾을 수 없을 때 사용한다.

 

Authentication vs Authorization

인증 vs 인가

인증은 간단하게 회원가입을 통해 로그인 하는 것을 의미하며,

인가는 각 사용자에 대한 권한을 확인하는 것을 의미한다. 사용자는 목적, 보안에 따라 권한을 부여받을 수 있다.

 

위 401과 403에 대해 부연설명 하자면,

401 Unauthorized의 경우, 인증받지 못한 유저의 접근을 제어하는 것이다.

그런데 http status로 unauthorized라고 표기되어 있어 헷갈릴 수 있다.

두 단어는 엄연히 다르며 이를 주의할 필요가 있다.


500번대 - 서버 내부 오류

Server Error

 

당연하지만 서버는 최대한 오류를 발생하면 안 된다.

다르게 표현하면, 프로세스 중에 서버 오류가 포함되어선 안 된다.

 

500, internal server error


추가

스프링에서는 HttpStatus를 사용하여 번호가 아니라 내용으로 전달할 수 있다.

...

import org.springframework.http.HttpStatus;

...

@RestController
@Slf4j
public class ArticleApiController {
    @PostMapping("/api/articles")
    public ResponseEntity<Article> create(@RequestBody ArticleDto dto) {
        Article created = articleService.create(dto);
        return (created != null) ?
                ResponseEntity.status(HttpStatus.CREATED).body(created) :
                ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
    }
}

예시에서는 HttpStatus.CREATED와 HttpStatus.BAD_REQUEST가 사용되었다.

'컴퓨터과학' 카테고리의 다른 글

도커란?  (0) 2023.06.26
HTTP 헤더란?  (0) 2023.06.11
API 요청에서 path, query, body의 차이점  (0) 2023.06.10
TCP/IP를 간단하게 알아보자  (0) 2023.06.10
Ubuntu 22.04 desktop 설치  (1) 2023.06.04