나는 빌딩이 a previous discussion I had with Jon Skeet입니다. 다음과 같이클라이언트에서 생성 한 GUID를 신뢰할 수없는 이유는 무엇입니까? PK를 클라이언트 GUID와 서버 GUID의 조합으로 처리하면 아무 것도 해결되지 않습니까?
내 시나리오의 요지는 다음과 같습니다
- 클라이언트 응용 프로그램이 데이터베이스에 유지해야 할 새로운 'PlaylistItem'개체를 만들 수있는 기능이 있습니다.
- 사용 사례에서는 PlaylistItem을 표시하기 전에 클라이언트가 서버의 응답을 기다릴 필요가 없도록 PlaylistItem을 만들어야합니다.
- 클라이언트는 PlaylistItem에 대한 UUID를 생성하고 클라이언트에 PlaylistItem을 표시 한 다음 서버에 저장 명령을 실행합니다.
이 시점에서 나는 클라이언트에서 생성 된 UUID를 데이터베이스의 개체의 PK로 사용하는 것이 좋지 않다는 것을 알고 있습니다. 그 이유는 악의있는 사용자가 생성 된 UUID를 수정하고 내 DB에서 PK 충돌을 강제 할 수 있기 때문입니다.
PlaylistItem에서 PK 충돌을 발생시키는 피해를 줄이기 위해 클라이언트 생성 UUID와 서버 생성 GUID의 두 ID의 복합체로 PK를 정의했습니다. 서버 생성 GUID는 PlaylistItem의 재생 목록 ID입니다.
지금 당분간이 솔루션을 사용하고 있지만 클라이언트 ID를 단순히 신뢰하는 것보다 내 솔루션이 더 나은 이유는 무엇인지 이해가 안됩니다. 사용자가 다른 사용자의 PlaylistItem 객체와 PK 콜리 손을 강제로 수행 할 수 있다면 해당 사용자의 PlaylistId를 제공 할 수 있다고 가정해야한다고 생각합니다. 그들은 여전히 콜리 손을 강요 할 수 있습니다.
그래서 ... 예. 이런 식으로하는 올바른 방법은 뭔가요? 클라이언트가 UUID를 만들도록 허용하고, 서버는 성공적으로 저장 될 때 엄지 손가락을 위/아래로줍니다. 충돌이 발견되면 클라이언트 변경 사항을 되돌리고 감지 된 collison을 알립니다.