티스토리 뷰
현재 로그인 관련해서 이슈가 있다.
먼저, 백단에서는 다음과 같이 구현되어있다.
- 사용자가 로그인을 하면 HttpSession을 이용해서 세션값을 부여하고, 세션에 해당 멤버 정보를 저장한다.
- 사용자가 다른 도메인 CRUD (게시글 작성, 수정 등등)을 사용하려하면 로그인 인증 정보를 받아온다.
- ArgumentResolver를 활용하여 @Login 어노테이션을 도입해서 session이 null이면 바로 예외를 던지고, 아니면 로그인한 사용자 객체를 돌려주도록 만들었다. (자세한건 로그인 구현부분 참조)
- 프론트 응답으론, 최초 로그인시 멤버 객체와 세션값을 내려준다.
그리고 프론트(안드로이드)단은 다음과 같이 구현되어있다.
- 서버로 부터 받은 세션값을 쿠키매니저에 저장한다.
- 레트로핏 인터셉터를 활용해서 모든 요청에 받아온 세션값을 Cookie로 해서 붙혀서 요청을 한다.
- 서버에서는 이를 보고 인증을 검사한다.
가 기본 로직이고, 포스트맨으로 테스트했을땐 잘 되어서 문제가 없는줄 알았는데... 안드로이드로 테스트를 해보니까 스프링에서 session을 잡지 못 한다.
안드로이드에서 최초 로그인을 하면 세션값을 잘 생성해서 HttpSession에 아주 잘 보관한다.
그리고 그 세션값을 아주 잘 서버로부터 받아와서 쿠키매니저에 아주 잘 저장한다.
그 후, 로그인을 하고, 게시글 작성을 접근했다.
놀랍게도 스프링에서 session을 잡지 못 한다.
스프링이 받는 Request의 모든 헤더값을 찍어봐도 내려준 세션값이 헤더에 잘 넣어져서 아주 잘 넘어오는걸 확인할 수 있다.
그런데 자꾸 session == null 로 잡혀서 서버가 로그인이 되었는지 인식을 하지 못 한다.
그래서 의문점이 생겼다.
# 1 세션은 결국 쿠키로 사용자 정보를 임의값으로 내려주는 매커니즘인데, 왜 헤더에 달아서 넘겨줘도 session이 null로 들어올까? -> 안드로이드 애뮬레이터 문제일 가능성을 배제할 수 없다.
근거 : 포스트맨으로 하면 잘 작동하기 때문이다.
# 2 근데 가만보니, 어차피 안드로이드는 화면을 사용자가 개발자가 의도한 버튼을 통해서만 액티비티나 프레그먼트를 이동할 수 있는데, 굳이 로그인 정보를 계속 HTTP 메시지로 주고받을 필요가 있을까?
어차피 스프링은 REST API를 제공하는 서버고, 클라이언트는 로그인을 하지 못 하면 다음 화면으로 넘어갈 수 없으므로, 로그인 정보를 서버에서 검증 안 하고 프론트 단에서 그냥 해결하면 안 될까?
(보안상 문제가 있을 것 같긴 하나.... 지금 당장 이 방법 외에는 해결책이 떠오르지 않고 무엇보다도 삽질하느라 시간과 노력을 너무 많이 소모했다....)
현재 해당 이슈를 고치느라 조금 애를 먹고 있다... 컨트롤러 로직을 전반적으로 수정하던가 아니면 세션유지 방법을 찾아내던가 해야겠다.