토마토 배달 앱 심화 프로젝트 회고
이번 심화 프로젝트에서는 ‘토마토 배달 앱’을 개발하여, 사용자와 상점 간의 효율적인 소통과 배달 주문 환경을 구축했습니다. 이 프로젝트는 특히 JWT 인증과 OAuth2.0을 통한 외부 인증 기능을 포함하며, 사용자별 권한에 따른 접근 제어와 리프레시 토큰을 통한 사용자 편의성을 높이는 데 중점을 두었습니다. 이번 회고에서는 프로젝트의 주요 기능과 기술적 접근, 그리고 개발 과정에서의 배운 점을 정리해보겠습니다.
프로젝트 개요 및 목표
토마토 배달 앱은 다양한 상점과 메뉴 등록을 허용하며, 사용자들이 로그인하여 가게에서 메뉴를 주문하고 리뷰를 작성할 수 있는 구조입니다. 상점주(OWNER)와 일반 사용자(USER)로 권한을 구분하여 역할에 따른 기능 사용을 제한하고, 인증된 사용자만 특정 기능에 접근하도록 구현하였습니다.
특히 이번 프로젝트의 목표는 안전하고 사용하기 편리한 사용자 인증 시스템을 구축하는 것이었습니다. 이를 위해 JWT와 OAuth2.0 기반의 로그인 및 인증 시스템을 도입하고, Spring AOP를 활용하여 각 API 접근 시 권한을 자동으로 확인하는 기능을 추가했습니다.
주요 기능 및 기술적 구현
1. 사용자 인증과 권한 관리
- JWT 인증: 회원 가입 및 로그인 시 JWT 토큰을 발급하여 클라이언트에서 사용자 정보를 유지합니다. HttpOnly 쿠키로 토큰을 저장해 클라이언트 측 접근을 제한하고 보안을 강화했습니다.
- OAuth2.0: 카카오와 구글 로그인 기능을 구현하여 사용자가 간편하게 로그인할 수 있도록 했습니다. 처음 로그인 시 OAuth에서 받은 정보로 회원 가입을 자동 처리하고, 동일한 이메일이 존재할 경우 로그인만 수행하도록 했습니다.
- 리프레시 토큰: JWT의 유효기간이 만료되면 리프레시 토큰으로 새로운 액세스 토큰을 발급하여 재인증 과정을 단축했습니다.
2. Spring AOP와 권한 기반 접근 제어
- AOP 기반의 권한 확인: API 호출마다 해당 사용자의 권한을 검증하고, 적절한 권한이 있는 사용자만 API에 접근하도록 했습니다. 이를 통해 코드 중복을 줄이고, 모든 API 호출의 보안성을 유지할 수 있었습니다.
- 로그 기록: AOP를 통해 각 API 접근 시 사용자의 정보와 요청 기록을 로그로 남겨 이후 문제 해결이나 보안 검토 시 유용하게 활용할 수 있도록 했습니다.
3. 다양한 도메인과 역할 기반 데이터 처리
- 유저 및 가게 관리: 사용자는 일반 사용자(USER)와 사장님(OWNER) 중 선택해 가입할 수 있으며, 사장님만이 상점을 등록할 수 있습니다. 상점의 개별 메뉴는 가게 조회 시 함께 표시되며, 가게의 폐업 시 상태 변경만으로 처리하여 데이터 보존과 편리성을 높였습니다.
- 주문 및 리뷰 관리: 고객은 각 메뉴에 대한 단일 주문만 가능하며, 주문의 상태는 사장님이 단계별로 변경할 수 있습니다. 또한, 고객은 주문 건에 대한 리뷰를 작성할 수 있지만, 단독 조회는 불가하도록 제한하여 리뷰 관리의 일관성을 유지했습니다.
도전 과제와 해결 방안
- OAuth2.0 로그인 구현
이번 프로젝트에서 도입한 OAuth2.0 로그인은 처음 시도해보는 기능으로, 외부 API를 통해 받아온 사용자 정보를 어떻게 효율적으로 관리할지 고민이 많았습니다. HandlerMethodArgumentResolver와 AOP를 조합하여, 반복적으로 작성해야 하는 코드를 줄이고 일관된 사용자 정보 접근을 보장했습니다. - 리프레시 토큰 및 보안 처리
엑세스 토큰이 만료될 때마다 새로운 엑세스 토큰을 발급하는 방식은 사용자 경험에 긍정적이지만, 리프레시 토큰의 관리가 중요했습니다. 리프레시 토큰 또한 만료 기간을 설정하여 보안성을 유지하고, 불필요한 리프레시 토큰 발급을 줄이는 데 집중했습니다. - 복잡한 권한 기반 데이터 접근 제어
상점주와 일반 사용자의 권한을 구분하여 접근할 수 있는 API를 구체화하는 것은 서비스의 기본적인 신뢰성을 유지하는 데 핵심이었습니다. Spring Security와 AOP의 권한 제어를 조합하여, 실수나 보안 취약점 없이 권한 기반 데이터 접근을 보장할 수 있었습니다.
프로젝트 구성 및 설계 구조
src
└── main
└── java
└── com
└── sparta
└── realtomatoapp
├── auth
├── common
├── menu
├── order
├── review
├── security
├── store
└── user
도메인 별로 패키지를 나누어 역할을 명확히 구분하고, 각 기능이 독립적이고 효율적으로 작동할 수 있도록 설계했습니다. JWT 인증 관련 필터와 유틸리티, AOP 관련 설정들은 security 패키지에 통합하여 일관성을 유지했습니다.
마무리하며
토마토 배달 앱 프로젝트는 인증과 보안, 권한 관리, OAuth2.0을 통한 외부 인증 등 다양한 기능을 다루며 큰 배움의 기회가 되었습니다. 유연하고 안전한 구조를 통해 사용자 경험을 극대화하는 것이 목표였으며, 이번 기회를 통해 이러한 구조를 설계하는 방법과 보안의 중요성을 실감할 수 있었습니다. 앞으로는 리프레시 토큰을 활용한 인증 관리와 각종 비즈니스 로직 최적화를 통해 앱의 완성도를 더욱 높이고자 합니다.
'프로젝트' 카테고리의 다른 글
스파르타코딩 Spring 기초 프로젝트 회고록 (0) | 2024.10.28 |
---|---|
스파르타코딩 Spring 팀소개 페이지 회고록 (0) | 2024.09.02 |