2011-04-21 3 views
0

id와 hibernate에 의해 관리되는 버전을 가진 User 엔티티와 firstname과 lastname이 있다고 가정 해 보겠습니다.RESTful API hibernate id와 버전을 숨기는 것

RESTful API를 사용하여 사용자 인스턴스에 CRUD 작업을 수행하려고하지만 클라이언트가 데이터베이스에 저장된 사용자의 ID 및 버전을 가져 오지 못하도록하고 싶습니다.

내가 생각할 수있는 간단한 해결책은 수정 된 ID와 버전을 가진 사용자의 표현을 보내고 "공개"값을 서버 메모리에있는 HashMap의 데이터베이스 값과 매핑하는 것입니다. 나는 또한 쿠키에 대해 생각하고 있지만 클라이언트가 해킹 할 수있는 보안 솔루션이라고 생각하지 않습니다. AFAIK, 순수한 RESTful API는 서버에서 세션 상태를 처리하지 않아야합니다.

실제 ID 및 버전을 공개하지 않고 리소스를 게시 할 수있는 안전하고 확장 가능하며 RESTful 한 방법이 있습니까?

+0

당신이 개체의 상태를 관리하기 위해 반사 기반 라이브러리를 사용하고 Symmetric-key algorithm를 참조하십시오? 마찬가지로, 사용자 개체에 대한 setter 메서드 호출은 어떻게 수행하고 있습니까? "RESTful"api는 여전히 하루 종일 일반적인 웹 MVC 모델에 속하므로 사용자가 선택한 속성을 수정할 수 있어야합니다. – hooknc

+0

요구 사항을 더 잘 이해하면 좋을 것입니다. 지금까지 그들은별로 의미가 없습니다. – Zepplock

답변

1

어려운 것. GET 요청을하려면 URI의 어딘가에서 ID 또는 일부 표현이 필요합니다.

사용자가 실제 ID를 얻는 것에 대해 걱정하십니까?

당신이 할 수있는 한 가지는 사용자의 ID가 프런트 엔드로 전송되기 전에 암호화하고 AES와 같은 대칭 암호화 알고리즘을 사용하여 백엔드에서 ID를 해독하는 것입니다.

+0

실제로 URI에는 REST 규칙이 없습니다 – Zepplock

+0

대칭 키 알고리즘은 암호화 된 ID를 보내고 서버에서 다시 해독 할 수있는 올바른 선택 인 것으로 보입니다. concurrecy 잠금에 대한 버전과 관련하여 HTTP 헤더의 Etag가 해결책이 될 수 있습니다. –

1

가장 좋은 방법은 당신의 UserEntity과를 분리하는 UserData를하다 : 당신이 '진정한'REST에 설정하는 경우

@Embeddable 
class UserData { 
    String firstName; 
    String lastName; 
    ... // getters and setters 
} 

// your mapped class 
class UserEntity { 
    int id; 
    int version; 
    UserData data; 
    // getters and setters 
} 
0

는 다음 개체의 전체 상태와 클라이언트를 제공 할 필요가거야 그 나중에 해당 작업을 수행해야합니다. 사용자가 수정할 수 없도록하려는 필드에 소금과 일부 대칭 암호화를 적용하는 것을 고려한 적이 있습니까? 해시를 통과 시키면 페이로드 크기가 분명 증가하지만 모든 것이 비용, 특히 보안과 함께 제공됩니다!

+1

"REST를 'true'로 설정하면 클라이언트에게 객체의 전체 상태를 제공해야합니다."나는 그것이 진실임을 심각하게 생각합니다. 당신은 당신이 좋아하는 자원의 상태를 표현할 수 있습니다. –

+0

그럼 네가 나머지 문장을 남겨두면 "행동을 취할 필요가있다.";)) ​​ – Affe

+0

동의. 네가 의미하는 바를 오해 한 것 같아. –

관련 문제