1. 요구사항

  • 사용자는 별도의 회원가입 없이 이름만 입력해서 로그인할 수 있어야 한다.
  • 로그인된 사용자는 채팅방을 생성할 수 있어야 한다.
  • 채팅방 목록은 실시간으로 동기화되어야 한다.
  • 초기 진입 시에는 기존 채팅방 목록을 REST API로 불러와야 한다.

2. API 명세서

🔐 POST /api/login

  • 사용자 이름으로 로그인 (회원가입 없음)

Request

  • Content-Type: application/x-www-form-urlencoded
  • Parameter:
    • name: string (required)

Response (200 OK)

{
  "success": true,
  "code": 200,
  "message": "로그인 성공",
  "data": "mj"
}

인증 방식

  • 세션 쿠키(JSESSIONID) 기반
  • 서버는 HttpSessionSPRING_SECURITY_CONTEXT 저장하여 인증 유지

📋 GET /api/chat/rooms

  • 전체 채팅방 목록 조회

Request

  • Headers: Cookie: JSESSIONID=...

Response (200 OK)

{
  "success": true,
  "code": 200,
  "message": "요청 성공",
  "data": [
    {
      "id": 1,
      "name": "테스트 채팅룸",
      "createdAt": "2025-04-06 19:31:51"
    },
    {
      "id": 2,
      "name": "백엔드 공부방",
      "createdAt": "2025-04-06 19:31:54"
    }
  ]
}

인증 필요

  • 로그인 후에만 호출 가능

🔐 POST /api/chat/rooms

  • 새로운 채팅방 생성

Request

  • Parameter:
    • name: string (required)
  • Headers: Cookie: JSESSIONID=...

Response (200 OK)

{
  "success": true,
  "code": 200,
  "message": "요청 성공",
  "data": {
    "id": 2,
    "name": "testChatRoom",
    "createdAt": "2025-04-06 19:31:54"
  }
}

실시간 처리

  • 생성 성공 시 STOMP로 /sub/chat/rooms 채널에 broadcast 됨

3. 문제 해결 (Troubleshooting)

① MvcRequestMatcher permitAll 이슈

  • 문제: .requestMatchers(mvc.pattern("/login")).permitAll()이 동작하지 않음
  • 원인: MvcMatcher가 DispatcherServlet과 서블릿 경로(/)를 정확히 판단하지 못함
  • 해결: AntPathRequestMatcher/login을 허용하자 즉시 해결됨

관련 포스팅: https://jinn-o.tistory.com/386

 

[SpringSecurity6.1] requestMatchers에서 오류가 나기 시작했다

0. 서론최근 Spring Boot 3.x + Spring Security 6.x로 프로젝트를 시작하면서 기존에 잘 사용하던 `.requestMatchers("/login", "/api/**")` 구문이 갑자기 다음과 같은 에러를 발생시키기 시작했다!This method cannot decid

jinn-o.tistory.com

 

② 인증 상태 유지 실패

  • 문제: 로그인 후 인증이 유지되지 않아 /chat/rooms 호출 시 403 발생
  • 원인: 인증 정보를 SecurityContextHolder에는 저장했지만, HttpSession에 저장하지 않음
  • 해결: 로그인 시 HttpSessionSPRING_SECURITY_CONTEXT 수동 저장하여 해결

 

4. 결론 및 추후 개발 사항

결론

  • V1에서는 "비회원 이름 기반 로그인 + 실시간 채팅방 생성 + REST 조회"까지 구현 완료
  • WebSocket(STOMP) 기반 실시간 브로드캐스트 구조를 잡음
  • Spring Security + 수동 인증 구조도 직접 구성하며 인증 흐름에 대한 이해를 높임

추후 개발 계획

  • 실시간 채팅 메시지 송수신 기능 구현
  • JWT 기반 인증 방식 도입하여 무상태 Stateless 구조 실험
  • Redis Pub/Sub 연동 → 서버 다중화 대응
  • Swagger 또는 REST Docs 기반 자동 API 명세화

이 문서는 2025년 4월 기준 CloudTalk 프로젝트 V1 개발 현황을 기준으로 작성되었습니다.

+ Recent posts