F10. 인증
이 프로젝트의 핵심 변경(A1 사용자 유형 제거)이 실제로 착지하는 지점이다.
1. 기능명
소셜 로그인 · 회원가입 · 로그아웃
2. 기능 목적
사용자가 최소한의 절차로 서비스에 진입하게 한다.
- 별도 회원가입 폼 없이 소셜 계정으로 즉시 시작한다
- 가입 시점에 사용자 유형을 묻지 않는다. 어떤 종류의 사용자인지 선언할 필요가 없다
- 로그인 이후 모든 권한은 관계로 판정된다 (
00-관계-판정)
변경점 — 기존에는 가입 시 모든 계정에
role = 'buyer'(입찰참여자) 기본값이 부여됐다. 사용자는 경매를 열고 싶어진 시점에 자신이 무엇을 바꿔야 하는지 스스로 알아내야 했다.
3. 동작 방식
3.1 지원 수단
| 제공자 | 비고 |
|---|---|
| Kakao |
이메일·비밀번호 가입은 제공하지 않는다.
3.2 가입·로그인 흐름
가입과 로그인은 구분되지 않는다. 동일한 진입점에서 처리한다.
| 순서 | 처리 |
|---|---|
| 1 | 사용자가 소셜 제공자를 선택한다 |
| 2 | 제공자 인증 화면으로 이동한다 |
| 3 | 인증 성공 시 콜백으로 복귀한다 |
| 4 | 사용자 정보를 생성하거나 갱신한다 |
| 5 | 서비스로 진입한다 |
3.3 사용자 정보 생성
인증된 계정 정보로 사용자 레코드를 생성한다.
| 항목 | 값 |
|---|---|
| 식별자 | 인증 제공자가 발급한 사용자 ID |
| 닉네임 | 소셜 계정 이름. 없으면 이메일 아이디 부분 |
| 이메일 | 소셜 계정 이메일 |
| 프로필 이미지 | 소셜 계정 아바타. 없으면 빈 값 |
사용자 유형(
role) 필드를 설정하지 않는다. 해당 개념이 존재하지 않는다.
이미 가입된 계정이면 기존 정보를 유지하고 변경된 항목만 갱신한다.
3.3.1 스키마 — 신규 구축
이 프로젝트는 레포지토리·데이터베이스·인증 설정을 모두 새로 구축한다. 기존 서비스는 그대로 두며, 데이터 이관과 마이그레이션이 일절 없다.
users 테이블에 role 컬럼을 만들지 않는다.
| 항목 | 처리 |
|---|---|
users.role | 생성하지 않음 |
| 기존 데이터 이관 | 없음 |
| 마이그레이션 절차 | 불필요 |
기존 서비스의
users.role은 NOT NULL이고 기본값이 없었다. 그대로 가져오면 가입할 때마다 값을 넣어야 하므로 유형 개념이 살아남는다. 새 스키마에는 컬럼 자체가 없으므로 이 문제가 발생하지 않는다.
신규 설정 항목
| 항목 | 내용 |
|---|---|
| 인증 제공자 | Google·Kakao OAuth를 새 프로젝트에 다시 등록한다 |
| 리디렉션 URL | 새 배포 도메인 기준으로 설정한다 |
| 환경 변수 | 새 프로젝트의 키로 교체한다 |
서비스는 데이터가 없는 상태에서 시작한다. 모든 목록 화면의 빈 상태(F2·F8)가 첫 화면이 되므로, 빈 상태 UI가 특히 중요하다.
3.4 로그인이 필요 없는 화면
| 경로 | 화면 |
|---|---|
/ | 진입 화면 |
/onboarding | 온보딩 (F11) |
/auth/signup | 로그인 |
/auth/callback | 인증 콜백 |
경매 열람(F2)도 비회원에게 열려 있다. 그 외 화면은 로그인이 필요하며, 미로그인 시 진입 화면으로 이동시킨다.
3.5 로그인 유도와 복귀
액션 시점에 로그인이 필요하면 원래 위치를 기억했다가 로그인 후 되돌린다.
경매 상세에서 '사연 작성하기' 클릭 (비회원)
→ 로그인
→ 원래 보던 경매 상세로 복귀
→ 사연 작성 이어서 진행
로그인 때문에 사용자가 하던 일을 잃지 않아야 한다.
왜 여기로 왔는지 알려준다. 둘러보던 사람이 하단 탭에서 알림·마이를 누르면 아무 설명 없이 로그인 화면을 만난다. 잘못 눌렀나 싶은 자리다. 화면 맨 위에 목적지를 담은 바를 세운다.
ⓘ 알림은 로그인해야 볼 수 있어요. 로그인하면 바로 이어집니다
| 항목 | 내용 |
|---|---|
| 판정 | next 가 곧 이유다. 프록시가 이미 원래 위치를 넘겨 주므로 사유를 따로 싣지 않는다 |
| 문구 | 목적지 이름으로 바꿔 단다 — 알림 · 마이페이지 · 배송지 · 포인트 내역 · 경매 등록 · 경매 수정 · 사연 작성 · 채팅 |
| 자리 | 로고보다 위, 화면 최상단. 가운데에 두었더니 파란 혜택 배너에 묻혀 가장 늦게 읽혔다 |
| 색 | surface-sunken 바탕. 레드는 쓰지 않는다 — 사용자가 잘못한 것이 없는데 오류로 읽힌다 (레드는 마감 임박·오류·필수 입력 전용, PRD B3) |
| 우선순위 | 로그인 오류(4.1)가 있으면 그것부터 보인다. 둘을 겹쳐 세우면 무엇이 급한지 흐려진다 |
| 직접 진입 | next 없이 진입 화면에 들어오면 바를 그리지 않는다 |
되돌아갈 길을 남긴다. 튕겨 온 사람에게 이 화면은 막다른 길이었다 — 로그인 하거나 주소창을 건드리는 수밖에 없었다. 좌측 상단에 뒤로가기를 둔다.
| 항목 | 내용 |
|---|---|
| 목적지 | next 에서 계산한다. 사연 작성·경매 수정은 그 경매 상세로, 나머지는 홈으로 |
| 노출 | 튕겨 온 경우(next 있음)에만. 직접 들어왔으면 돌아갈 곳이 없다 |
브라우저 뒤로가기를 흉내 내지 않는다. 왔던 곳은 로그인이 필요한 화면이라 프록시가 다시 로그인 화면으로 튕긴다 — 둘 사이를 왕복하게 된다. 그래서 로그인 없이 볼 수 있는 가장 가까운 자리로 보낸다.
처음에는 회색 안내를 혜택 배너 아래에 두었는데 화면에서 가장 늦게 읽혔다. 색만 올려도 자리가 가운데면 다시 묻힌다 — 자리가 먼저다.
맨 위로 올린 뒤 잉크 블루로 채워도 봤지만 이번엔 소개보다 안내가 세지는 역전이 생겼다. 자리가 이미 시선을 잡아 주므로 색은 한 단계 눌러도 된다.
3.6 세션 유지
| 상황 | 처리 |
|---|---|
| 재방문 | 유효한 세션이 있으면 로그인 상태를 복원한다 |
| 화면 복귀 (탭 전환 등) | 세션을 재확인해 사용자 정보를 갱신한다 |
| 다른 기기에서 로그아웃 | 세션 변경을 감지해 로그아웃 상태로 전환한다 |
3.7 로그아웃
자리 — 마이페이지 헤더 우측 액션 (F8 3.1). 아이콘만 쓰고 색은 한 단계 죽인다.
묻고 나서 끊는다. 확인 다이얼로그를 세우고, 확인을 받으면 세션을 종료하고 진입 화면으로 이동한다. 저장된 사용자 정보를 화면에서 제거한다.
| 항목 | 내용 |
|---|---|
| 제목 | 로그아웃할까요? |
| 본문 | 다시 로그인하면 그대로 이어집니다 |
| 버튼 | 취소(왼쪽) · 로그아웃(오른쪽) |
취소는 아무것도 바꾸지 않고 닫는다. 덮개를 누르거나 Esc 를 눌러도 취소와 같다.
요청은 POST 다. 링크 프리페치나 이미지 태그로 남의 세션을 끊을 수 없어야 한다. 자바스크립트가 없으면 확인 없이 곧바로 로그아웃된다 — 묻지 못하는 것이 로그아웃되지 않는 것보다 낫다.
3.8 제거 대상
| 대상 | 사유 |
|---|---|
가입 시 role 기본값 부여 | 사용자 유형 개념 삭제 (A1) |
| 역할 변경 처리 | 모드 전환 기능 삭제 (A2) |
role 기반 테마 전환 | 로그인 시 특정 유형에 다크 모드를 적용하던 처리 삭제 (B1) |
4. 예외 처리
| 상황 | 처리 |
|---|---|
| 소셜 인증 취소 | 사용자가 제공자 화면에서 취소한 경우, 조용히 원래 화면으로 되돌린다. 오류로 표시하지 않는다 |
| 소셜 인증 실패 | "로그인에 실패했습니다. 다시 시도해주세요" 안내 후 재시도를 제공한다 |
| 이메일 정보 없음 | 사용자 정보를 만들 수 없으므로 가입을 중단하고, 이메일 제공에 동의가 필요함을 안내한다 |
| 사용자 정보 생성 실패 | 인증은 성공했으나 정보 저장에 실패한 상태다. 재시도하고, 계속 실패하면 로그아웃 후 재로그인을 안내한다 |
| 정보 생성 지연 | 인증 직후 정보가 아직 준비되지 않았을 수 있다. 짧은 지연 후 재조회한다. 그동안 화면은 스켈레톤으로 표시한다 |
| 세션 만료 | 진입 화면으로 이동시킨다. 만료된 사용자 정보를 화면에 남기지 않는다 |
| 콜백 파라미터 이상 | 진입 화면으로 이동시키고 재시도를 안내한다 |
| 로그인 후 복귀 위치 유실 | 홈(/main)으로 이동시킨다. 오류 화면을 띄우지 않는다 |
| 이미 로그인된 상태에서 로그인 화면 진입 | 홈으로 이동시킨다 |
| 로그아웃 요청 실패 | 클라이언트 세션을 정리하고 진입 화면으로 이동시킨다. 로그인 상태로 남겨두지 않는다 |
| 네트워크 오류 | 재시도를 제공한다. 인증 중간 상태로 방치하지 않는다 |
5. 완료 조건
| # | 조건 |
|---|---|
| 1 | Google·Kakao 로그인이 동작한다 |
| 2 | 가입 과정에 사용자 유형 선택 단계가 없다 |
| 3 | users.role 컬럼이 스키마에 존재하지 않는다 (값 미사용이 아니라 컬럼 삭제) |
| 3-1 | 컬럼 삭제 이후에도 신규 가입이 정상 동작한다 |
| 4 | 역할 변경 처리가 코드에 존재하지 않는다 |
| 5 | 로그인 시 유형에 따른 테마 전환이 발생하지 않는다 |
| 6 | 가입 직후 사용자가 경매 등록과 사연 작성 모두에 바로 접근할 수 있다 (F1·F3) |
| 7 | 로그인 후 원래 보던 화면으로 복귀한다 |
| 8 | 비회원이 3.4의 화면과 경매 열람에 접근할 수 있다 |
| 9 | 세션 만료 시 만료된 정보가 화면에 남지 않는다 |