사용자가 쇼핑 목록을 만들고, 쇼핑 목록을보고, 쇼핑 목록을 공유 할 수있는 간단한 쇼핑 목록 앱을 준비 중입니다. 사용자가 쇼핑 목록을 만들지 않았다고 말하면서 x
라고 말하면서 다른 사용자가 만든 것이므로 데이터베이스에 있는데이 쇼핑 목록을 만들지 않은이 사용자에게 어떤 상태 코드를 반환해야합니까? 데이터베이스에 있기 때문에 403
이되어야하지만이 사용자는 쇼핑 목록의이 사용자 컬렉션에 존재하지 않으므로이 사용자는보기 권한이 없으며 404
이어야합니다.어떤 응답 상태 코드를 반환해야합니까?
답변
당신은 404를 반환해야합니다 : 사용자가 다른 사용자가 소유 동일한 ID를 가진 다른 카트에 대해 알고는 안된다.
반환 403은 악의적 인 해커가 연속적인 사용자 ID로 API를 치고 카트를 소유 한 사용자를 찾을 때까지 보안 흐름으로 간주됩니다.
이 경우 쇼핑 목록은 데이터베이스에 추가되고 shopping_list 객체에서'owned_by' 필드를 사용하여 사용자와 관련됩니다. 쇼핑 목록 카트와 같은 것이 없습니다. 사용자. 이 경우 귀하의 대답은 여전히 동일합니까? –
예, 내 대답은이 개체를 제공하기 위해 선택한 이름과 관계없이 계속됩니다. – alfasin
실제로 cart-id뿐만 아니라'owned_by'를 확인하도록 쿼리를 설정할 수 있기 때문에 실제로 구현하는 것이 더 쉽습니다. 즉, 쿼리가 빈 결과 집합을 반환하고 응용 프로그램이 404로 "자연스럽게"응답합니다. – alfasin
허용되는 답변은 완벽하지만 괜찮 으면 모든 ID에 대해 403을 보내는 대안이 있습니다 (존재하지 않더라도). 그렇게하면 보안 구멍도 없습니다. 나는 사용자가 인증을 통해 확인되었다고 가정하고/lists/200이 그들의 것임을 알고 있으므로 200 개의 ID가 아마도 존재할 것입니다./list/50과/lists/50000000이 모두 403을 반환하면 사용자는 더 현명하지 않습니다.
이 동작은 404 프록시를 공개적으로 캐시 할 수 있지만 403 응답을 캐시 할 수없는 캐시 프록시와 같은 중개인에게는 더욱 안전합니다.
사용자와 관련된 경로를 지정합니다 (예 : '/ users/{userId}/lists/{listId}'를 사용하십시오. '/ users/{user1Id}/lists/{user2listId}'가 404이거나'/ users/{user2Id}/lists/{anything} '에 접근하는 user1이 403이라는 것은 의심의 여지가 없습니다. 현재 사용자는 그것을 보지 않아야합니다. 403. – jonrsharpe