티스토리 뷰

반응형

현재 로그인 관련해서 이슈가 있다.

 

먼저, 백단에서는 다음과 같이 구현되어있다.

  • 사용자가 로그인을 하면 HttpSession을 이용해서 세션값을 부여하고, 세션에 해당 멤버 정보를 저장한다.
  • 사용자가 다른 도메인 CRUD (게시글 작성, 수정 등등)을 사용하려하면 로그인 인증 정보를 받아온다.
  • ArgumentResolver를 활용하여 @Login 어노테이션을 도입해서 session이 null이면 바로 예외를 던지고, 아니면 로그인한 사용자 객체를 돌려주도록 만들었다. (자세한건 로그인 구현부분 참조)
  • 프론트 응답으론, 최초 로그인시 멤버 객체와 세션값을 내려준다.

 

그리고 프론트(안드로이드)단은 다음과 같이 구현되어있다.

  • 서버로 부터 받은 세션값을 쿠키매니저에 저장한다.
  • 레트로핏 인터셉터를 활용해서 모든 요청에 받아온 세션값을 Cookie로 해서 붙혀서 요청을 한다.
  • 서버에서는 이를 보고 인증을 검사한다.

가 기본 로직이고, 포스트맨으로 테스트했을땐 잘 되어서 문제가 없는줄 알았는데... 안드로이드로 테스트를 해보니까 스프링에서 session을 잡지 못 한다.

 

안드로이드에서 최초 로그인을 하면 세션값을 잘 생성해서 HttpSession에 아주 잘 보관한다.

 

스프링 부트 로그
안드로이드 스튜디오 Logcat

그리고 그 세션값을 아주 잘 서버로부터 받아와서 쿠키매니저에 아주 잘 저장한다.

 

안드로이드 스튜디오 Logcat

그 후, 로그인을 하고, 게시글 작성을 접근했다.

 

스프링 부트 로그창

놀랍게도 스프링에서 session을 잡지 못 한다.

 

스프링이 받는 Request의 모든 헤더값을 찍어봐도 내려준 세션값이 헤더에 잘 넣어져서 아주 잘 넘어오는걸 확인할 수 있다.

그런데 자꾸 session == null 로 잡혀서 서버가 로그인이 되었는지 인식을 하지 못 한다.

 

그래서 의문점이 생겼다.

# 1 세션은 결국 쿠키로 사용자 정보를 임의값으로 내려주는 매커니즘인데, 왜 헤더에 달아서 넘겨줘도 session이 null로 들어올까? -> 안드로이드 애뮬레이터 문제일 가능성을 배제할 수 없다.

 

근거 : 포스트맨으로 하면 잘 작동하기 때문이다.

 

# 2 근데 가만보니, 어차피 안드로이드는 화면을 사용자가 개발자가 의도한 버튼을 통해서만 액티비티나 프레그먼트를 이동할 수 있는데, 굳이 로그인 정보를 계속 HTTP 메시지로 주고받을 필요가 있을까?

어차피 스프링은 REST API를 제공하는 서버고, 클라이언트는 로그인을 하지 못 하면 다음 화면으로 넘어갈 수 없으므로, 로그인 정보를 서버에서 검증 안 하고 프론트 단에서 그냥 해결하면 안 될까?

(보안상 문제가 있을 것 같긴 하나.... 지금 당장 이 방법 외에는 해결책이 떠오르지 않고 무엇보다도 삽질하느라 시간과 노력을 너무 많이 소모했다....)

 

현재 해당 이슈를 고치느라 조금 애를 먹고 있다... 컨트롤러 로직을 전반적으로 수정하던가 아니면 세션유지 방법을 찾아내던가 해야겠다.

반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크