17장
REST API 보호하기(Protecting REST APIs)
17.1 문제점
내 사이트의 일부를 인증받은 REST로 노출하기를 원하지만 (HTTP기반의 인증이 아닌) 커스텀 인증으로 하길 원합니다.
커스텀 디스패치를 사용하는 것에 대해서 생각하고 있지만 인증받았는지를 알기 위해서 리퀘스트 핸들러 스스로가 모든 리퀘스트를 체크해야 할 것이라는 것을 의미합니다.
인증(Authentication)는 단지 서버에서 SeesionVar입니다. 그래서 REST 클라이언트와 서비스사이에 양쪽방향으로 세션 식별자(session identifier)를 주고 받을 방법이 필요합니다. 만약쿠키가 있자면 전송될 것이지만 Lift가 세션의 id를 URL에 추가할 것입니다.(최소한 주소창에서 볼 수 있습니다.)
그래서 SessionVar를 설정하는 공개된 “로그인” REST호출을 가지고 있다고 가정하면 어떻게 이것을 투명하게 REST 클라이언트에 건낼수 있습니까? 토큰 시스템에 대해서 생각해보았지만 그것은 세션시스템의 복사본처럼 보입니다.
다른 제안이 있습니까?
17.2 해결책
만약 당신이 다음 코드를 가지고 있다면:
object MyService extends RestHelper {
....
}
그리고:
val ensureSession: PartialFunction[Req, Unit] = {
case _ if isLoggedIn =>
}
그리고 Boot는:
import net.liftweb.util.Helpers._
LiftRules.dispatch.append(ensureSession guard MyService)
이것은 PartialFunction를 작성하고 PartialFunction의 모든 엘리먼트주의에 가드(guard)를 두는 간단한 방법입니다.
Comments