물론입니다! 발표하면서 보기에 편한 논리 구조 형태로 스크립트를 다시 작성해드리겠습니다. 각 섹션별로 중요한 포인트와 설명을 쉽게 전달할 수 있도록 구성했습니다.
1. 도입
안녕하세요.
저는 PHCCS 프로젝트의 백엔드 파트를 발표할 전진구입니다.
발표를 시작하겠습니다.
2. 발표 개요
먼저
오늘 제가 설명할 내용은 다음과 같습니다:
1. MVC 패턴 구조
2. 기술 스택 소개
3. JWT와 WebSocket 기반의 1:1 채팅 서비스 설명
3. MVC 패턴 구조
간단히 짚고
약자
먼저 PHCCS 프로젝트는 REST 기반의 MVC 패턴을 따릅니다.
- MVC 패턴이란?
- M (Model): 데이터와 비즈니스 로직을 처리합니다.
- V (View): 사용자가 보는 화면을 렌더링합니다.
- C (Controller): 사용자의 요청을 받아서 데이터를 처리한 후 View에 전달합니다.
하지만 저희 프로젝트는 REST 기반으로 설계되어, View 역할을 React가 담당합니다.
즉, 백엔드는 Model과 Controller의 역할을 중점적으로 수행합니다.
4. 기술 스택 소개
PHCCS 프로젝트에서 사용된 기술 스택은 다음과 같습니다.
- Spring Boot: 백엔드 프레임워크로 사용하였으며, Spring MVC 구조로 설계되었습니다.
- REST API: 클라이언트와 서버 간 데이터를 교환하는 방식으로 사용되었습니다.
- MySQL: 데이터베이스로 사용하였으며,
- MyBatis: 데이터베이스와 상호작용을 위해 사용됩니다.
- JWT (JSON Web Token): 사용자 인증과 보안을 위해 사용됩니다.
- WebSocket: 1대1 채팅 기능을 위해 사용된 양방향 통신 프로토콜입니다.
5. JWT (JSON Web Token) 설명
이제
먼저
JWT란 무엇인가?
- JSON 기반의 웹 표준 토큰으로, 보안성이 높습니다.
- 토큰 생성 시 사용자 정보를 포함할 수 있으며, 서명을 통해 위조 여부를 검증할 수 있습니다.
- 두 가지 토큰을 사용합니다:
- Access Token: 짧은 유효 기간 동안 API 요청에 사용됩니다.
- Refresh Token: Access Token이 만료되었을 때, 새로운 Access Token을 발급받기 위한 용도로 사용됩니다.
왜 JWT를 사용했는가?
- 보안 강화: 서명된 토큰은 위조를 방지할 수 있습니다.
- 사용자 정보 포함: 토큰에 사용자 ID와 권한정보를 포함시켜 DB 에 저장된 사용자 정보에 빠르게 접근 할 수 있음
- Acesstoken 과 refreshtoken으로 인한 보안과 사용자경험: 균형있게 유지가능
물론입니다! 강조 부분을 굵게 적용한 수정된 텍스트는 다음과 같습니다.
6. JWT 속성 정의
의존성 추가가 끝난 후, JWT 속성을 정의해야 합니다.
이 설정은 주로 application-jwt.properties 파일에서 이루어집니다.
- 발급자(issuer): 해당 토큰을 발급하는 서버의 정보를 정의합니다.
- 비밀키(secret key): 토큰을 서명하고 검증할 때 사용하는 비밀키입니다. 이는 대칭키 또는 비대칭키로 사용할 수 있습니다.
- AccessToken 유효시간: Access Token의 만료 기간을 설정합니다. 일반적으로 짧은 유효 기간(예: 15분)이 설정됩니다.
- RefreshToken 유효시간: Refresh Token의 유효 기간을 설정합니다. 보통 더 긴 유효 기간(예: 7일 또는 그 이상)을 가집니다.
이 설정을 통해 토큰 발급 및 검증 시 필요한 주요 정보를 정의합니다.
7. JWT 생성 및 인증 과정
JWT 생성 흐름
- 이메일과 비밀번호 검증: 클라이언트의 입력값을 DB와 대조하여 유효성을 확인합니다.
- Access Token 생성: 사용자의 ID와 역할을 포함하여 생성됩니다.
- Refresh Token 생성: 비교적 더 긴 유효 기간을 갖고, Access Token이 만료되면 사용됩니다.
- 클라이언트에게 두 토큰 반환: 이후 클라이언트는 이 토큰들을 이용해 인증된 요청을 보냅니다.
8. Jwts.builder()
Jwts.builder:
해당 코드 Jwts.parserBuilder 는 실제로 JWT를 생성하는 메서드입니다.
JJWT 라이브러리에서 제공하며, JWT의 헤더(Header), 페이로드(Patload), 서명(Signature) 등을 설정하고 최종적으로 JWT 토큰을 문자열로 생성합니다.
9. JWT 인증 흐름
JWT 인증 필터의 흐름:
- 화이트 리스트 확인: 인증이 필요 없는 경로는 필터를 통과합니다.
- Authorization 헤더 검증: JWT가 포함되어 있는지 확인합니다.
- JWT 토큰 검증: 유효성을 검증한 후, 통과된 요청만 컨트롤러로 전달됩니다.
10. Jwts.parserBuilder
JWT 인증 필터의 흐름:
왼쪽의 코드 Jwts.parserBuilder JJWT라이브러리에서 제공하는 토큰을 검증하는 메서드입니다.
해당 메소드는 JWT 토큰을 파싱하고 클레임을 추출합니다.
이과정에서 토큰의 서명을 검증하는 과정이 포함됩니다.
토큰 서명을 검증하는 과정을 설명해드리겠습니다.
우선 .setSigningkey() 에서 토큰 생성시 사용된 비밀키와 동일한 비밀키를 설정합니다.
그리고 .parseClaimsJws() 에서 실제로 JWT 토큰을 파싱하고, 서명 검증과 유효성 검증을 진행합니다.
해당 과정을 성공적으로 마치면 토큰에서 추출한 클레임을 반환하고 서명이 유효하지않거나 토큰 자체에 문제가 생겼다면 예외를 발생시킵니다.
11. WebSocket 기반의 1:1 채팅 서비스 설명
왜 WebSocket을 사용했는가?
- 실시간 상호작용을 위한 1:1 통신을 구현하기 위함입니다.
- 양방향 통신이 가능하여 클라이언트와 서버가 모두 데이터를 주고받을 수 있습니다.
- HTTP 프로토콜로 핸드셰이크 후, WebSocket으로 전환되며 연결을 유지합니다.
이를 통해 성능을 최적화하고, 빠른 데이터 전송이 가능합니다.
12. WebSocket 처리 흐름
핸들러 클래스를 통해 3가지 주요 처리 작업이 가능합니다:
- 초기 연결 처리: 클라이언트가 채팅방에 접근할 때, 연결을 설정합니다.
- 메시지 전송 처리: 연결 후, 채팅 메시지를 주고받는 로직을 처리합니다.
- 연결 해제 처리: 채팅이 끝나면, 연결을 해제하고 채팅방에서 나가는 작업을 처리합니다.
11. SSE (Server-Sent Events) 설명
SSE란 무엇인가?
- Server-Sent Events의 약자로, 서버에서 특정 이벤트가 발생하면 비동기적으로 클라이언트에게 데이터를 전송하는 기술입니다.
- SSE는 단방향 통신으로, 서버에서 클라이언트로만 데이터를 전송합니다.
왜 SSE를 사용했는가?
- 폴링 방식의 비효율성 해결: 클라이언트가 주기적으로 서버에 요청을 보내는 방식은 서버 부하가 커집니다.
- WebSocket과의 차이: WebSocket은 양방향 통신이 필요할 때 적합하지만, 알림 기능처럼 단방향 통신에는 SSE가 더 적합합니다.
- HTTP 기반의 SSE는 WebSocket보다 적은 비용으로 동작할 수 있습니다.
12. SSE 적용 흐름
- SseEmitter 객체 생성: 스프링에서 제공하는
SseEmitter 객체를 통해 SSE 연결을 설정합니다.
- 이벤트 등록: SSE를 통해 비동기적으로 연결 종료, 타임아웃, 에러 처리를 관리합니다.
- 더미 데이터 전송: 첫 연결 시 더미 데이터를 전송해 503 오류를 방지합니다.
13. 마무리
이상으로 PHCCS 프로젝트의 백엔드 구성 및 주요 기술에 대한 설명을 마치겠습니다.
질문이 있으시면 언제든지 해주시기 바랍니다.