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) 기반
- 서버는 HttpSession에 SPRING_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에 저장하지 않음
- 해결: 로그인 시 HttpSession에 SPRING_SECURITY_CONTEXT 수동 저장하여 해결
4. 결론 및 추후 개발 사항
결론
- V1에서는 "비회원 이름 기반 로그인 + 실시간 채팅방 생성 + REST 조회"까지 구현 완료
- WebSocket(STOMP) 기반 실시간 브로드캐스트 구조를 잡음
- Spring Security + 수동 인증 구조도 직접 구성하며 인증 흐름에 대한 이해를 높임
추후 개발 계획
- 실시간 채팅 메시지 송수신 기능 구현
- JWT 기반 인증 방식 도입하여 무상태 Stateless 구조 실험
- Redis Pub/Sub 연동 → 서버 다중화 대응
- Swagger 또는 REST Docs 기반 자동 API 명세화
이 문서는 2025년 4월 기준 CloudTalk 프로젝트 V1 개발 현황을 기준으로 작성되었습니다.
'Project > CloudTalk' 카테고리의 다른 글
[CloudTalk v2] 채팅방별 실시간 메시지 처리 & BlockingQueue 기반 비동기 저장 구조 설계 (0) | 2025.04.10 |
---|---|
STOMP, Simple Text Oriented Messaging Protocol (0) | 2025.03.23 |
[프로젝트 소개 및 설계 자료 조사] 클라우드 톡. (0) | 2025.01.22 |