Develop/Java & Spring
[Spring Boot] 게시판 프로젝트 v2.0 - JWT를 이용한 회원가입 및 로그인 구현 #1 세팅
jjh0119
2025. 3. 26. 13:21
#1. 게시판 프로젝트 v2.0
부지런히 프로젝트를 버전업 하기위해 노력했는데 JWT가 생각보다 쉽지 않았다. JWT는 개발 공부를 시작한 초기에 굉장히 간단한 형태로 적용했었고 Spring Security는 처음 다뤄보는지라 Docs나 다른 자료들을 많이 참고해야했는데 이게 개념은 간단한 것 같은데 매커니즘은 생각만큼 간단하지 않아 시행착오도 많이 겪었다. 일주일간 코드에도 꽤 많은 변화를 줘가며 온몸비틀기를 한 결과 토큰 발급과 그 토큰을 기반으로 한 인증 과정을 성공적으로 만들어 낼 수 있었다.
#2. 요구사항 정의
- 전체 게시글 목록 조회
- 게시글 전체에 대하여 제목, 작성자명 조회하기
- 게시글 ID 내림차순으로 정렬하기
- 게시글 작성
- 제목, 작성자명, 작성 내용 등을 DB에 저장
- 선택한 게시글 조회
- 선택한 게시글의 제목, 작성자명, 작성 날짜, 작성 내용 등을 조회
- 선택한 게시글 삭제
- 선택한 게시글을 DB에서 삭제
- 게시글 검색
- 유저로부터 제공받은 keyWord가 포함된 제목을 가진 게시글들을 검색
- 페이지네이션
- 전체 목록, 검색된 목록에 대하여 페이징 처리
- 회원가입
- 이메일과 이름 비밀번호를 입력받아 Mysql DB에 저장
- 로그인
- 클라이언트로부터 전달 받은 이메일과 비밀번호를 기반으로 DB에 등록된 멤버 조회
- 로그인 시 Access Token과 Refresh Token을 각각 발급 후 쿠키에 저장해 클라이언트로 전달
- Refresh Token은 Redis에 이메일과 함께 저장하고 RTR방식을 통해 다시 발급하며 Refresh Token의 정보 갱신
- Refresh Token을 통해 로그인 유지
- 로그아웃
- 로그아웃 요청 시 쿠키에 저장된 Access Token, Refresh Token을 파기하고 Redis에 저장된 Refresh Token도 삭제
- Refresh Token이 만료된 경우에도 로그아웃 처리
#3. 유스케이스 다이어그램
Actor가 User와 Guest로 나누어졌고 Guset는 게시글 목록 조회와 검색, 회원가입만 가능하도록 권한 설정
#4. API 명세서 명세서
#5. Redis 생성
DB는 게시판 프로젝트에서 사용하던 MySQL을 메인으로 계속 사용하고 추가로 Refresh Token 저장을 위한 Redis를 추가로 생성하기 위해서 Docker-compose도 수정해줬다.
- docker-compose.yml
redis_container:
image: redis:latest
container_name: redis_test
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
- ./redis/conf/redis.conf:/usr/local/conf/redis.conf
labels:
- "name=redis"
- "mode=standalone"
restart: always
command: redis-server /usr/local/conf/redis.conf
extra_hosts:
- "host.docker.internal:host-gateway"
#6. Build.gradle 설정
- Build.gradle
Security와 JWT, Redis를 위한 Dependency를 추가
//Security
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'
// JJWT
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
//redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
#7. application.yml 설정
Redis 로드
- application.yml
data:
redis:
host: localhost
port: 6379
#8. 프로젝트 구조
board패키지에 비해 양이 많아졌다. 때문에 회원가입 및 로그인 JWT 관리를 위한 security 패키지를 따로 만들고 그 안에서도 member와 jwt 패키지로 나눴다. 후에 추가로 OAuth를 사용하기 위한 패키지도 들어올 예정이다.