배경
websocket 에서의 사용자 인증로직을 구현하다가
사용자 정보를 세션으로 관리하는 과정에서
ws 연결되어있는 사용자가 http 요청을 보내면 세션이 어떻게 되는 거지? 라는 생각이 들었다
분리되어 관리된다는 말을 봤는데 진짜인지 궁금해서 테스트해봤다.
시나리오
- 회원가입
- ws 연결 맺고 세션에 사용자 정보 저장하기
- ws 연결 맺은 클라이언트가 http 요청 보내고,
- http 요청 시 세션 정보(세션 id, 사용자 정보) 로그로 출력해보기
- 예상안1 : ws와 http 세션이 따로 관리되어 세션id가 다르고 사용자 정보가 확인되지 않음
- 예상안2 : 같은 클라이언트로 인식해서 ws연결에서 세션에 저장된 사용자 정보가 출력됨
츄라이~
결과
1. 소켓 연결 전 http 요청으로 확인한 session id
: 7491B3D4CEDFCE8CD4D0B2A02282B39F
20240927 15:37:08.764 [http-nio-8080-exec-5] [INFO] c.r.s.d.t.TestController - session id : 7491B3D4CEDFCE8CD4D0B2A02282B39F
2. 소켓 연결 CONNECT 요청 시 확인한 session id
: 9379cea3-1fe2-13f8-1b0d-8daa4c072a10
20240927 15:40:53.054 [http-nio-8080-exec-8] [INFO] c.r.s.d.r.c.StompInterceptor - session id : 9379cea3-1fe2-13f8-1b0d-8daa4c072a10
3. 소켓 연결 후 SUBSCRIBE, SEND 요청 시 확인한 session id
: 9379cea3-1fe2-13f8-1b0d-8daa4c072a10
→ CONNECT 시와 동일
20240927 15:44:24.125 [http-nio-8080-exec-9] [INFO] c.r.s.d.r.c.StompInterceptor - session id : 9379cea3-1fe2-13f8-1b0d-8daa4c072a10
4. 소켓 연결 후 http 요청으로 확인한 session id
: 7491B3D4CEDFCE8CD4D0B2A02282B39F
→ 소켓 연결 전 http 요청과 동일, 소켓 연결 세션과는 다름!
소켓 세션에 저장해둔 사용자 정보도 확인되지 않음(null)
20240927 15:45:47.291 [http-nio-8080-exec-2] [INFO] c.r.s.d.t.TestController - session id : 7491B3D4CEDFCE8CD4D0B2A02282B39F
결론
- 같은 클라이언트라도 http 와 ws 의 세션은 별개로 생성되고 관리된다.
- session id 값이 형식까지 완전히 다르다.
- http : 7491B3D4CEDFCE8CD4D0B2A02282B39F
- ws : 9379cea3-1fe2-13f8-1b0d-8daa4c072a10
- 디버깅해보니 ws 요청 시 sessionAttribute 내의 session id 는 simpSessionId 라는 이름으로 저장되어있었다.
- [?] simp가 붙는 건 simpMessageBroker 사용과 관련이 있는걸까? session id 는 정확히 누가 생성해서 부여하는 걸까?
- session id 값이 형식까지 완전히 다르다.
- ws 연결 중 http 를 요청해도 다른 세션을 사용한다.
그동안 왜 이런 의문이 든 적이 없었나 생각해봤는데,
api 서버 위주로 개발하면서 session을 사용하지 않고 stateless하게 token (JWT) 을 사용한 인증 로직만 구현해왔었다.
이번에 websocket 기능을 제대로 구현하면서 세션을 사용하게 되어 요런 고민을 하게 된 거였다. 재밌다!
새로 생긴 의문에 대해서도 다음에 알아보겠다.
( [?] simp가 붙는 건 simpMessageBroker 사용과 관련이 있는걸까? session id 는 정확히 누가 생성해서 부여하는 걸까?)