인증 API는 회원가입과 로그인을 담당하며, 투표 API는 데모데이 투표와 파트장 투표 기능으로 구성되어 있습니다. 로그인 이후에는 JWT 기반 access token을 쿠키로 전달하고, 투표 API 호출 시 해당 쿠키를 통해 사용자를 인증하는 구조입니다.
본 프로젝트는 로컬 개발 환경과 실제 운영(Production) 환경을 완벽히 분리하여 구축했습니다. AWS EC2 인스턴스(Ubuntu) 내부에 MySQL을 설치하고, Spring Boot 서버가 localhost:3306/vote_db를 바라보도록 설정하여 독립적인 운영 DB 환경을 마련했습니다.
이를 통해 로컬 테스트 데이터와 실제 서비스 데이터가 섞이지 않도록 격리성을 확보했습니다.
회원가입 API의 경로는 /signup입니다.
이번 프로젝트의 회원가입은 일반적인 신규 회원 생성 방식이 아니라, DB에 미리 등록된 사용자 정보를 기반으로 계정을 활성화하는 방식입니다.
즉, 사용자가 입력한 name, team, part, inviteCode 값을 기준으로 기존 users 테이블에서 일치하는 사용자를 찾고, 해당 사용자 레코드에 loginId와 password를 등록합니다.
비밀번호는 그대로 저장하지 않고, PasswordEncoder를 사용해 암호화한 뒤 저장합니다. 이를 통해 DB에 비밀번호 원문이 노출되지 않도록 처리했습니다.
로그인 API의 경로는 /login입니다.
사용자가 loginId와 password를 입력하면, 서버는 해당 정보를 검증한 뒤 JWT access token을 생성합니다. 생성된 토큰은 응답 바디가 아니라 응답 헤더의 Set-Cookie를 통해 쿠키로 전달됩니다.
| 항목 | 설정값 | 설명 |
|---|---|---|
| name | accessToken | JWT가 저장되는 쿠키 이름 |
| HttpOnly | true | JavaScript에서 쿠키 접근 불가 |
| Secure | false | 현재 개발 환경에서는 HTTPS가 아니어도 전송 가능 |
| Path | / | 전체 경로에서 쿠키 사용 가능 |
| Max-Age | 3600 | 1시간 유지 |
| SameSite | Lax | 기본적인 CSRF 방어 효과 |
이번 구현에서는 JWT를 직접 구현한 JwtProvider에서 생성하고 검증합니다.
JWT payload에는 sub, iat, exp가 포함되며, sub에는 사용자 ID가 저장됩니다. 이후 투표 API에서는 쿠키에 담긴 access token을 읽어 JWT의 서명과 만료 시간을 검증하고, userId를 추출해 DB에서 실제 User 정보를 조회합니다.
투표 API 호출 시 인증 흐름은 다음과 같습니다.