
솔픽 애플리케이션의 로그인 흐름은 기존 사용자와 신규 사용자일 경우 각각 다르다
LoginForm 컴포넌트에서 authApi.login(email, password) 호출AuthController의 /auth/login 엔드포인트로 전달AuthController는 AuthService를 호출하여 로그인 처리 요청AuthService는 RecipickAuthClient를 통해 레시픽 API 연동첫 로그인 (신규 사용자)
memberService.existsByEmail()로 솔픽 DB에 사용자 존재 여부 확인RecipickAuthClient를 통해 회원 정보 조회MemberService.createMember()를 통해 솔픽 DB에 새 회원 정보 저장기존 사용자 로그인
인증 성공 후 이미 등록된 사용자인 경우
1. MemberService.getMemberByEmail()로 DB에서 사용자 정보 조회
2. 솔픽 DB에 저장된 사용자 정보 획득
JWTUtil.generationToken() 메소드를 통한 JWT 토큰 생성Authorization: Bearer {token} 헤더)TokenCheckFilter가 모든 /api/* 요청을 가로채서 토큰 유효성 검증SecurityContextHolder에 저장SecurityContextHolder를 통해 현재 사용자 정보에 접근 가능인증 클라이언트(RecipickAuthClient)
JWT 유틸(JWTUtil)
토큰 체크 필터(TokenCheckFilter)
인증 흐름
사용자 → 솔픽 로그인 페이지 → 레시픽 API 인증 → JWT 발급 → 자원 접근
첫 로그인(신규 사용자 -> 레시픽엔 있지만 솔픽엔 데이터가 없는)
기존 사용자
나의 주 역할은 두 서비스를 연결하는 것이었다. 때문에 레시픽과 솔픽 두 개의 분리된 시스템을 어떻게 효율적으로 연결할지 고민이 많았다. 고민만 3일은 한 듯.. 우선 로그인부터 SSO나 OAuth 2.0을 도입할까 생각했지만 여러 현실적인 문제로 다른 접근 방식이 필요했다.
레시픽은 기존 Spring Framework 기반으로 이미 구축되어 있었고, 솔픽은 Spring Boot로 새로 개발해야 해서 완전한 통합은 기존 시스템인 레시픽의 전체적인 수정이 필요했다. 제한된 시간 내에 두 시스템을 연결해야 했기 때문에 복잡한 프로토콜을 처음부터 구현하기엔 시간이 부족했고, 두 서비스를 오가며 느낄 만한 불편함을 최소화하고 싶었다.
솔픽은 Spring Boot로 개발할 예정이었기에 솔픽만 JWT 토큰을 사용하고 Spring Security로 인증 흐름을 관리하는 방식을 선택했다. 레시픽의 인증 API를 만들어 사용자를 검증하고, 성공 시 JWT를 발급하는. 우리 상황에선 최선의 실용적인 선택이었다고 생각한다.
로그인 프로세스를 개발하면서 서로 다른 환경의 데이터 통신에 대해 익숙해질 수 있었지만 Security는 여전히 뜯어볼게 많다.
두 프로젝트 모두 직접 구현한 서비스라 굳이 이렇게 안해도 됐지만, 각각의 다른 목적을 가진 분리된 서비스가 서로의 데이터베이스에 직접적으로 접근한다는건 적절하지 않다 생각했고, 두가지 서비스의 통합에 대한 호기심도 컸다. 결과적으로 연동 작업에만 2주 정도의 시간이 필요했다..ㅎㅎ!
로그인 정리 끝!