인증 인가의 상태 코드 반환은 어떻게 해야할까?
인증이 실패하면 늘 401일까? 상황에 따른 적절한 HTTP 상태 코드를 살펴보자.
인증 인가와 상태 반환 코드
요구사항
- HTTP 표준과 부합해야한다.
- Client 입장에서 처리하기 편리해야한다.
- 보안을 고려해야한다.
고려대상
- 인증에 실패할 경우 항상 401 (Unauthorized)
- 상황에 따른 HTTP Status code
- 인증 정보가 있는 경우
- 성공
- 실패
- 잘못된 정보로 인증 하는 경우
- 유효한 인증이나 접근이 불가능 한 경우
- 403 ? 404 ?
- 인증 정보가 없는 경우
- 인증 정보가 있는 경우
의사결정
- 상황에 따라 HTTP Status code 를 분리해서 나타내야한다.
- 잘못된 인증 정보(만료된 토큰과 같은 경우)에 대해서만
401 Unauthorized
로 처리한다.- 만약 모든 비인가 상태에 대해서
401 Unauthorized
로 보낼 경우 다음과 같은 문제가 발생할 수 있다.- 우선
401 Unauthorized
의 경우인증 과정의 이슈
를 나타내는 상태코드이다. 따라서, 이는 token 만료 혹은 잘못된 인증 정보에 대한 응답이 적합하다.잘못된 정보로 인증을 시도한 것 같아
라는 응답에 적합하다.
- 반면
403 Forbidden
혹은404 Not Found
은 해당 자원에 대한 접근에 대한 처리이다.403 Forbidden
의 경우네가 누구인지는 아는데, 이러한 이유로 이 자원에 접근할 수 없어.
라고 명시적으로 클라이언트에게 알린다.404 Not Found
의 경우(네가 누구인지 아는데 해당 자원에 어차피 접근 못할거니까) 그냥 없는 페이지라고 알려줘야겠다.
라고 생각하면 된다. 아래 설명하겠지만, 보안적으로 이 편이 낫다.
- 우선
- 만약 모든 비인가 상태에 대해서
- 권한 문제로 인해 접근이 불가능한 경우에는
404 Not Found
으로 처리한다.- 의미적으로는
403 Forbidden
이 적합할 수 있다. 그러나, 보안적인 측면에서는404 Not Found
를 전달하는 것이 더 유리하다. - 403 Forbidden
The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead. - Attacker 입장에서
403 Forbidden
으로 전송받을 경우 유사 경로에 대해서 공격을 감행할 수 있는 근거가 마련될 수 있다. 서버 입장에서는 이러한 공격을 방지하기 위해 이러한 정보를 제공하지 않음으로서 보안을 한층 강화할 수 있다. - Security through obscurity 에 대한 예시를 하나 들자면 이런 느낌이다.
- 영화 '아저씨'를 보면, 특별한 과거를 가진 원빈의 정보에 대해서만 특별히 접근 권한을 제한했다. 경찰들은 이를 통해서 원빈에 대해서
이 사람 무언가 있다!
라고 추측을 할 수 있었다. 그리곤 알다시피 특별한 방법(?)를 동원해 그의 정보를 얻어냈다. - 만약, 해당 인물에 대해서 조회했을 경우
이런 사람 없는데요?
라고 조회 결과를 보여줬다면, 경찰들은우리가 잘못 조회한건가?
우리 데이터베이스에 없는 사람인가?
아니면이 사람 특별한 사람인가?
라고 여러 방식으로 생각한다. 일반적으로는잘못 조회한 것 같네 가명을 쓰나? 성형했나? 뭐지?
라고 생각하며 그의 정보를 찾는데 어려움을 겪었을 것이다.
- 영화 '아저씨'를 보면, 특별한 과거를 가진 원빈의 정보에 대해서만 특별히 접근 권한을 제한했다. 경찰들은 이를 통해서 원빈에 대해서
- 따라서, 접근 불가능한 사용자가 경로에 대한 추측을 할 수 없도록
404 Not Found
를 응답한다.- 다만, 서버 내에서는 이를 단순 Not Found 와 같은 로그를 남기기보다는 잘못된 유저의 접근임을 명확하게 남기자.
- 의미적으로는