F10. 인증

F10. 인증

이 프로젝트의 핵심 변경(A1 사용자 유형 제거)이 실제로 착지하는 지점이다.

1. 기능명

소셜 로그인 · 회원가입 · 로그아웃

2. 기능 목적

사용자가 최소한의 절차로 서비스에 진입하게 한다.

  • 별도 회원가입 폼 없이 소셜 계정으로 즉시 시작한다
  • 가입 시점에 사용자 유형을 묻지 않는다. 어떤 종류의 사용자인지 선언할 필요가 없다
  • 로그인 이후 모든 권한은 관계로 판정된다 (00-관계-판정)

변경점 — 기존에는 가입 시 모든 계정에 role = 'buyer'(입찰참여자) 기본값이 부여됐다. 사용자는 경매를 열고 싶어진 시점에 자신이 무엇을 바꿔야 하는지 스스로 알아내야 했다.

3. 동작 방식

3.1 지원 수단

제공자비고
Google
Kakao

이메일·비밀번호 가입은 제공하지 않는다.

3.2 가입·로그인 흐름

가입과 로그인은 구분되지 않는다. 동일한 진입점에서 처리한다.

순서처리
1사용자가 소셜 제공자를 선택한다
2제공자 인증 화면으로 이동한다
3인증 성공 시 콜백으로 복귀한다
4사용자 정보를 생성하거나 갱신한다
5서비스로 진입한다

3.3 사용자 정보 생성

인증된 계정 정보로 사용자 레코드를 생성한다.

항목
식별자인증 제공자가 발급한 사용자 ID
닉네임소셜 계정 이름. 없으면 이메일 아이디 부분
이메일소셜 계정 이메일
프로필 이미지소셜 계정 아바타. 없으면 빈 값

사용자 유형(role) 필드를 설정하지 않는다. 해당 개념이 존재하지 않는다.

이미 가입된 계정이면 기존 정보를 유지하고 변경된 항목만 갱신한다.

3.3.1 스키마 — 신규 구축

이 프로젝트는 레포지토리·데이터베이스·인증 설정을 모두 새로 구축한다. 기존 서비스는 그대로 두며, 데이터 이관과 마이그레이션이 일절 없다.

users 테이블에 role 컬럼을 만들지 않는다.

항목처리
users.role생성하지 않음
기존 데이터 이관없음
마이그레이션 절차불필요

기존 서비스의 users.roleNOT 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. 완료 조건

#조건
1Google·Kakao 로그인이 동작한다
2가입 과정에 사용자 유형 선택 단계가 없다
3users.role 컬럼이 스키마에 존재하지 않는다 (값 미사용이 아니라 컬럼 삭제)
3-1컬럼 삭제 이후에도 신규 가입이 정상 동작한다
4역할 변경 처리가 코드에 존재하지 않는다
5로그인 시 유형에 따른 테마 전환이 발생하지 않는다
6가입 직후 사용자가 경매 등록과 사연 작성 모두에 바로 접근할 수 있다 (F1·F3)
7로그인 후 원래 보던 화면으로 복귀한다
8비회원이 3.4의 화면과 경매 열람에 접근할 수 있다
9세션 만료 시 만료된 정보가 화면에 남지 않는다