Skip to content

[DOC/CHAT] Client에서 WebSocket 연결시 절차 안내 #80

@Cassiiopeia

Description

@Cassiiopeia

💡 Description

웹소켓 연결 과정에서의 JWT 인증 절차는 보안성을 높이고, 유저의 인증 상태를 정확히 관리하기 위해 중요합니다.

클라이언트와 서버 간의 상세한 인증 흐름에 대한 절차입니다.

1. AccessToken 유효성 검사 요청

클라이언트 동작: 웹소켓 연결을 시도하기 전, 클라이언트는 서버에 HTTP 요청을 보내어 현재 AccessToken의 유효성을 검사합니다.

이 때, /validate-token 엔드포인트로 GET 요청을 보내며, 요청 헤더에 Access-Token: {Access Token} 을 포함시켜서 보냅니다.

GET /validate-token
Headers: { "Access-Token": "<Your_Access_Token>" }

서버 동작: 서버는 /validate-token 엔드포인트에서 AccessToken의 유효성을 검증하고, 응답으로 isValid와 isExpired 플래그를 포함한 TokenValidationResponse 객체를 반환합니다.

다음 정보를 포함합니다

    {
        isValid = "true",
        isExpired = "false"
    }

2. AccessToken 유효성 검사 응답 처리

유효한 토큰: isValid: true인 경우, 클라이언트는 웹소켓 연결을 진행합니다. 웹소켓 엔드포인트 /ws에 AccessToken과 함께 연결을 시도합니다.

만료된 토큰: isValid: false 및 isExpired: true인 경우, 클라이언트는 /reissue 엔드포인트로 POST 요청을 보내 AccessToken 재발급을 요청합니다. 재발급 요청 시, Refresh-Token을 요청 헤더 또는 쿠키에 포함하여 보냅니다.

POST /reissue
Cookie: Refresh-Token={Your_Refresh_Token}

3. AccessToken 재발급과 웹소켓 연결 재시도

서버 동작: /reissue 요청을 받은 서버는 Refresh-Token의 유효성을 검증하고, 유효한 경우 새로운 AccessToken을 발급하여 클라이언트에게 반환하게됩니다.

클라이언트측 동작: 새로운 AccessToken을 받은 클라이언트는 이 토큰을 사용하여 웹소켓 연결을 다시 시도해야합니다.

4. 웹소켓 연결 실패 처리

연결 실패: 웹소켓 연결이 실패하거나 서버로부터 null 응답을 받은 경우

클라이언트는 설정된 타임아웃 시간(예: 10초)을 초과하면 자동으로 연결 실패 처리를 진행합니다.

클라이언트는 사용자에게 연결 실패를 알립니다. 재연결로직도 구현할수있고요

image

5. 웹소켓 프로토콜 인증과정에서 인증실패시 null을 반환하는 이유

: 인증 과정에서 에러 메시지를 명확히 반환하면, 공격자가 이 정보를 이용하여 시스템의 보안 취약점을 찾아낼 수 있습니다.
: HTTP 프로토콜은 요청과 응답은 상태를 유지하지않는 개별 트랜잭션으로 처리되는 반면에 웹소켓 프로토콜은 한번 연결되면 지속적인 연결상태를 유지하므로 더 중요하다고 볼 수 있습니다.
: 에러 메시지가 구체적으로 어떤 인증 단계에서 실패했는지를 밝히면, 공격자는 해당 정보를 바탕으로 보안 공격을 시도할 수 있습니다. 따라서, 웹소켓 연결 시 인증 실패는 구체적인 에러 메시지 없이 처리되어 진행합니다.


## 📚 References https://shout-to-my-mae.tistory.com/396#%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%20%ED%83%80%EC%9E%84%EC%95%84%EC%9B%83%20%EC%BD%94%EB%93%9C-1

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationenhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions