Search
🔐

웹소켓 토큰 인증/인가 구현기

Person
태그
인증/인가

웹소켓 통신도 토큰 인증을 해야 하나요? 예.

여차저차 http 토큰인증에 성공하고 기뻐하던 찰나 새로운 벽을 맞이했습니다. 그것은 바로... 웹소켓 통신에서의 토큰 인증 인가 였습니다.
웹소켓은 http 통신과 다르게 https:// http:// 가 아닌, wss/ws/ 로 시작합니다. 또한 일반적인 통신과 다르게 1:1 로 요청하고, 응답하고, 연결이 끊기는 방식이 아니라 하나의 구독 엔드 포인트가 닫히지 않는 이상 여러명이 발행한 내용을 볼 수 있죠.
구현하고 보니 로직은 이전과 크게 다르지 않았습니다. 그럼 어떻게 토큰 인증 인가를 구현 하였는지 알려드리겠습니다.

웹소켓 핸들러 생성

웹소켓은 다음과 같이 두 단계로 이루어 집니다.
1.
CONNECT
2.
SUBSCRIBE / PUBLISH
먼저 소켓에 연결하고, 구독을 하거나, 발행을 하죠. 여기서 이제 의문이 생기게 됩니다.
로그인을 했더라도 발행 엔드포인트를 알아내면 굳이 로그인한 사람이 아니더라도 마구 발행을 해버릴 수 있잖아..?
생각해보니 상당히 무서운 상황...
그래서 웹소켓에도 토큰인증 인가 과정을 거치게 되었고, 과정은 다음과 같습니다.
1.
소켓 연결, 발행 엔드포인트로 들어오는 요청을 탈취합니다.
2.
이전과 같이 헤더에 있는 토큰을 꺼내어 토큰의 유효성을 검사 합니다.
3.
토큰이 유효하면 시큐리티에 정보를 건내주고 시큐리티 필터를 거칩니다.
4.
유저 인증이 완료되면 인가 과정을 거치게 되고, 인가를 받으면 요청을 처리합니다.

토큰 필터와 시큐리티 설정 변경

토큰 필터 수정

토큰 필터에서 /ws 로 요청이 들어오면 토큰 필터를 거치지 않도록 코드를 수정해줘야 합니다. 그렇지 않으면 토큰필터에서 먼저 토큰 인증을 거치고, 웹소켓 핸들러로 넘어가게 됩니다.

시큐리티 설정 수정

시큐리티 설정에서 /ws 로 들어오는 요청은 permitAll() 으로 설정해주어야 합니다. 이렇게 하면 일단 요청을 받고, 구독 과정과 발행과정일 경우 핸들러에서 탈취하여 토큰 인증 인가를 수행하게 됩니다.