세션 토큰으로 유저정보 가져올때 보안 문제

브라우저에서 A가 로그인한 후에 생성되는 세션 토큰을 쿠키든 어디든 저장한 상태입니다.
이 A토큰을 가지고 Parse.User.become(A토큰) 으로 A 유저 정보를 가져왔는데 문득 의문이 들더군요.

B라는 사람이 로그인한 토큰값을 가지고 become을 하면 어떻게 될까? 헐! 근데 역시나 B 유저의 정보를 아무런 문제없이 가져오더군요.

좀 이상한 생각이 들었습니다. Session 객체에는 분명 installationId 필드가 있는데 이녀석은 뭐하길래
저렇게 남의 세션토큰을 탈취해서 호출해도 문제없이 개인정보를 가져올수있을까? 그리고 분명 서버로 요청을 날릴때 헤더정보에는 앱아이디와 더불어 _InstallationId 값도 던지고 있는데 왜 비교하지 않는 거지?

그래서 다시 한번 헤더 정보를 확인해봤더니 브라우저에서 새로고침할때마다 _InstallationId가 바뀌더군요.
결국 become 메소드와 _InstallationId는 서로 관계가 없다는 결론을 지었습니다.

device라면 분명 세션토큰과 인스톨레이션아이디를 비교해서 인증을 할텐데,…
브라우저에서는 _InstallationId 가 매번 바뀌는 상황에서 어떻게 인증된 유저를 검증할수있을까요?
토큰 갈취 당하면 그냥 게임셋인가요?

아니면 다른 방법이 있을까요?


자문 자답 입니다.
인스톨레이션 값이 변경되는 이유를 찾았습니다. -_-;… ㅎㅎㅎ
Parse.CoreManager.setStorageController 을 오버라이딩해서 세션스토리지에 저장하고 있었는데, 인스톨레이션 값은 로컬스토리지에 저장 되는군요. 의미상 당연히 그래야겠죠? 그래서 인스톨레이션 값을 불러올수있도록 오버라이딩한 코드를 살짝 수정했습니다.

Parse.CoreManager.setStorageController({
  async: 0,
  getItem: (path) => {

    if(0 < path.indexOf('installationId') ) {
      return localStorage.getItem(path);
    }
    return sessionStorage.getItem(path);
  },

... 중략 ...
}

토큰 인증도 직접 구현해서 인스톨레이션 ID 값과 토큰 값을 비교해서 처리했습니다.

2 Likes