SOLPick 로그인 구현

MELIES·2025년 3월 2일

솔픽 로그인 프로세스

솔픽 애플리케이션의 로그인 흐름은 기존 사용자와 신규 사용자일 경우 각각 다르다

1. 로그인 요청 처리

  1. 사용자가 이메일과 비밀번호를 입력하고 로그인 폼 제출
  2. LoginForm 컴포넌트에서 authApi.login(email, password) 호출
  3. 요청이 AuthController의 /auth/login 엔드포인트로 전달
  4. AuthControllerAuthService를 호출하여 로그인 처리 요청

2. 레시픽 API 연동을 통한 사용자 인증

  1. AuthServiceRecipickAuthClient를 통해 레시픽 API 연동
  2. 레시픽 API 엔드포인트(/api/auth/authenticate)로 인증 요청
  3. 레시픽 서버에서 이메일/비밀번호 검증 후 결과 반환
  4. 인증 실패 시 에러 응답 반환

3. 사용자 정보 처리 (첫 로그인, 기존 사용자)

첫 로그인 (신규 사용자)

  1. 인증 성공 시 memberService.existsByEmail()로 솔픽 DB에 사용자 존재 여부 확인
  2. 등록된 사용자가 없는 경우, RecipickAuthClient를 통해 회원 정보 조회
  3. 레시픽 API 엔드포인트(/api/members/info)에서 사용자 상세 정보 획득
  4. MemberService.createMember()를 통해 솔픽 DB에 새 회원 정보 저장
  • 솔픽 Member 엔티티에 레시픽 사용자 ID(recipickUserId) 맵핑
  • 이메일, 이름, 닉네임 등 기본 정보 복사

기존 사용자 로그인

인증 성공 후 이미 등록된 사용자인 경우
1. MemberService.getMemberByEmail()로 DB에서 사용자 정보 조회
2. 솔픽 DB에 저장된 사용자 정보 획득

4. JWT 토큰 발급 및 응답

  1. JWTUtil.generationToken() 메소드를 통한 JWT 토큰 생성
  • 토큰에 포함되는 정보
    - 이메일
    - 솔픽 회원 ID
    - 레시픽 회원 ID
  1. 클라이언트에 응답 반환
  • JWT 토큰
  • 회원 정보(이메일, 이름, 닉네임, ID 등)
  1. 클라이언트는 받은 토큰을 localStorage에 저장 (이후 요청에 사용)

5. 인증 후 요청 처리

  1. 로그인 이후 모든 API 요청에 JWT 토큰이 포함됨 (Authorization: Bearer {token} 헤더)
  2. TokenCheckFilter가 모든 /api/* 요청을 가로채서 토큰 유효성 검증
  3. 토큰 유효성 검증 후, 토큰 내 사용자 정보를 SecurityContextHolder에 저장
  4. 컨트롤러에서 SecurityContextHolder를 통해 현재 사용자 정보에 접근 가능

핵심 구성

인증 클라이언트(RecipickAuthClient)

  • 레시픽 API와의 통신 담당
  • 사용자 인증 및 회원 정보 조회 요청 처리

JWT 유틸(JWTUtil)

  • JWT 토큰 생성 및 검증 기능 제공
  • 사용자 정보를 토큰에 포함시키고 만료 시간 설정

토큰 체크 필터(TokenCheckFilter)

  • Spring Security 기반 필터
  • API 요청마다 토큰을 검증하고 사용자 정보 설정
  • 토큰 관련 오류 처리(만료, 형식 오류 등)

첫 로그인과 기존 사용자 로그인 비교

인증 흐름

사용자 → 솔픽 로그인 페이지 → 레시픽 API 인증 → JWT 발급 → 자원 접근

첫 로그인(신규 사용자 -> 레시픽엔 있지만 솔픽엔 데이터가 없는)

  • 레시픽 API에서 회원 정보 추가 조회 필요
  • 솔픽 DB에 회원 정보 저장 과정 필요
  • 레시픽 사용자 ID와 솔픽 사용자 ID 연결 작업 수행

기존 사용자

  • 레시픽 API에서 인증만 수행
  • 솔픽 DB에서 기존 회원 정보 조회
  • 추가 DB 저장 작업 불필요

SSO도 Oauth도 아닌..

나의 주 역할은 두 서비스를 연결하는 것이었다. 때문에 레시픽과 솔픽 두 개의 분리된 시스템을 어떻게 효율적으로 연결할지 고민이 많았다. 고민만 3일은 한 듯.. 우선 로그인부터 SSO나 OAuth 2.0을 도입할까 생각했지만 여러 현실적인 문제로 다른 접근 방식이 필요했다.

레시픽은 기존 Spring Framework 기반으로 이미 구축되어 있었고, 솔픽은 Spring Boot로 새로 개발해야 해서 완전한 통합은 기존 시스템인 레시픽의 전체적인 수정이 필요했다. 제한된 시간 내에 두 시스템을 연결해야 했기 때문에 복잡한 프로토콜을 처음부터 구현하기엔 시간이 부족했고, 두 서비스를 오가며 느낄 만한 불편함을 최소화하고 싶었다.

솔픽은 Spring Boot로 개발할 예정이었기에 솔픽만 JWT 토큰을 사용하고 Spring Security로 인증 흐름을 관리하는 방식을 선택했다. 레시픽의 인증 API를 만들어 사용자를 검증하고, 성공 시 JWT를 발급하는. 우리 상황에선 최선의 실용적인 선택이었다고 생각한다.

로그인 프로세스를 개발하면서 서로 다른 환경의 데이터 통신에 대해 익숙해질 수 있었지만 Security는 여전히 뜯어볼게 많다.

두 프로젝트 모두 직접 구현한 서비스라 굳이 이렇게 안해도 됐지만, 각각의 다른 목적을 가진 분리된 서비스가 서로의 데이터베이스에 직접적으로 접근한다는건 적절하지 않다 생각했고, 두가지 서비스의 통합에 대한 호기심도 컸다. 결과적으로 연동 작업에만 2주 정도의 시간이 필요했다..ㅎㅎ!

로그인 정리 끝!

profile
42 Seoul

0개의 댓글