| 항목 | 내용 |
|---|---|
| 프로젝트명 | MOA |
| 서비스명 | auth/global module |
| 서비스 유형 | 인사이트 아카이빙 서비스 |
| 개발 기간 | 2026.02.09 ~ 2026.02.13 |
| 개발 인원 | 5명 |
| 담당 역할 | 사용자 인증 도메인 설계, 로그인 검증 로직, JWT Access/Refresh Token 발급, Redis Refresh Token 저장소, 로그아웃 API 진입점 구현 |
| 사용 기술 | Java 17, Spring Boot 4.0.2, Spring WebMVC, Spring Data JPA, Spring Security, JJWT, Spring Data Redis, MariaDB, Gradle, Lombok |
| 플랫폼 | Web Backend / Spring Boot API |
MOA는 인사이트, 요약, 태그 등 콘텐츠성 데이터를 관리하는 Spring Boot 기반 백엔드 프로젝트입니다.
auth/global module은 MOA 서비스의 사용자 인증과 토큰 생명주기를 담당하는 공통 인증 모듈입니다. 사용자는 이메일을 기준으로 식별되며, 로그인 시 저장된 비밀번호 해시와 요청 비밀번호를 검증한 뒤 JWT Access Token과 Refresh Token을 발급하는 흐름을 구성했습니다.
또한 Refresh Token은 Redis에 RT:{email} 형태로 저장해 서버 측에서 토큰을 관리할 수 있도록 했고, 로그아웃 요청이 들어오면 Authorization 헤더에서 Bearer 토큰을 추출해 인증 서비스 계층으로 전달하는 API 진입점을 구성했습니다.
| 기능 | 설명 |
|---|---|
| 사용자 인증 Entity 설계 | user 테이블과 매핑되는 AuthEntity를 구성하고 email, password, name, role 정보를 관리 |
| 인사이트 작성자 연관관계 | AuthEntity와 InsightEntity를 1:N으로 연결해 사용자와 작성 콘텐츠의 관계 구성 |
| 사용자 Repository | JpaRepository 기반으로 email을 PK로 사용하는 사용자 조회 및 중복 확인 흐름 구성 |
| 회원가입 서비스 흐름 | 이메일 중복 여부를 확인하고 사용자 정보를 저장하는 트랜잭션 서비스 구조 구성 |
| 로그인 검증 | 이메일로 사용자를 조회하고 PasswordEncoder.matches로 비밀번호 해시 검증 |
| JWT 발급 유틸 | JJWT 기반으로 사용자 email을 subject로 갖는 Access Token, Refresh Token 생성 |
| 토큰 만료 정책 | Access Token 30분, Refresh Token 7일 만료 시간을 JwtProvider 내부에 분리 |
| Refresh Token 저장 | RedisTemplate을 사용해 Refresh Token을 RT:{email} 키로 7일 TTL 저장 |
| Refresh Token 조회/삭제 | email 기준 Refresh Token 조회 및 삭제 메서드 제공 |
| 로그아웃 API 진입점 | /logout 요청의 Authorization 헤더에서 Bearer 토큰을 추출하고 서비스 계층으로 위임 |
| 환경 설정 연동 | jwt.secret 값을 외부 환경변수 기반으로 주입받아 JWT 서명 키로 사용 |
문제 상황
MOA 서비스의 인사이트, 요약, 태그 데이터는 사용자를 기준으로 생성되고 관리되어야 합니다. 따라서 사용자를 고유하게 식별할 수 있는 인증 도메인이 필요했고, 콘텐츠 작성자와 사용자 계정 간의 관계도 함께 표현해야 했습니다.
해결 방법
AuthEntity를 user 테이블과 매핑하고 email을 기본키로 사용했습니다. password, name, role을 사용자 인증 및 권한 판단에 필요한 필드로 구성했으며, InsightEntity와 1:N 관계를 설정해 사용자가 작성한 인사이트 목록을 엔티티 관계로 표현했습니다.
구현 포인트
@Entity, @Table(name = "user")로 JPA 테이블 매핑@Id로 지정해 사용자 식별자로 사용