인증 인가의 상태 코드 반환은 어떻게 해야할까?

인증 인가와 상태 반환 코드

요구사항

  • 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 와 같은 로그를 남기기보다는 잘못된 유저의 접근임을 명확하게 남기자.


Read more

대량의 더미 데이터 DB에 주입하기

대량의 더미 데이터 DB에 주입하기

대량의 더미 데이터 DB에 주입하기 현재 만들고 있는 토이 프로젝트에서는 대량의 데이터가 존재하는 DB 를 대상으로 여러가지 테스트를 수행한다. 테스트를 수행하기 위해서 더미 데이터를 주입할 방법에 대해서 모색해야했다. SQL Procedure * SQL 문으로 직접 테이블에 데이터를 주입한다. * 직접 Insert into () values (); 와 같은 구문을 작성할 수도 있지만, Procedure 혹은 function 을

By Sungjun Park
Lombok 에 대한 짧은 생각

Lombok 에 대한 짧은 생각

최근 Java / Spring 으로 스택을 변경하면서 작은 프로젝트를 하고 있다. 팀원의 추천으로 lombok 이라는 라이브러리를 사용하게 되었다. Lombok 을 쓰면 정말 간단하다. Getter, Setter, Constructor, equals, hashCode 과 같이 작성해야하지만 작성에 피로를 느끼는 코드들을 annotation을 통해서 너무 쉽게 만들 수 있다. 그런데, 이 라이브러리 사용할수록 필요성에 대한 의문이 생긴다. 생각을

By Sungjun Park