Auth example
OAuth 로그인 ERD 예시
사용자, OAuth 계정, 세션, 이메일 인증, 비밀번호 재설정을 분리해 로그인 시스템을 설계하는 ERD 예시입니다.
상황
OAuth 로그인 ERD 예시
이메일 로그인과 Google OAuth 로그인을 함께 지원하는 서비스의 인증 데이터 모델입니다.
핵심 테이블
users, oauth_accounts, sessions
중요 관계
users 1:N oauth_accounts
주의점
토큰 원문 저장 금지
요구사항
요구사항
- 한 사용자는 이메일 계정과 여러 OAuth 제공자 계정을 연결할 수 있습니다.
- 로그인 세션은 만료와 폐기를 추적해야 합니다.
- 비밀번호 재설정과 이메일 인증 토큰은 보안상 해시만 저장합니다.
테이블 설계
테이블 설계
users서비스 계정- id PK
- email UNIQUE
- name
- email_verified_at
- password_hash
oauth_accounts외부 로그인 연결- id PK
- user_id FK
- provider
- provider_user_id
- linked_at
sessions로그인 세션- id PK
- user_id FK
- token_hash
- expires_at
- revoked_at
email_verifications이메일 인증- id PK
- user_id FK
- token_hash
- expires_at
- used_at
password_resets비밀번호 재설정- id PK
- user_id FK
- token_hash
- expires_at
- used_at
관계
관계
users 1:N oauth_accountsusers 1:N sessionsusers 1:N email_verificationsusers 1:N password_resets
설계 포인트
설계 포인트
OAuth 제공자 ID는 provider와 묶어 유니크로 둡니다
Google과 GitHub가 같은 문자열 ID를 가질 수 있으므로 provider, provider_user_id 복합 UNIQUE가 안전합니다.
세션 토큰은 해시만 저장합니다
DB가 유출되어도 세션 원문 토큰이 재사용되지 않도록 token_hash와 만료 시점만 저장합니다.
인증 이벤트는 감사 로그와 분리할 수 있습니다
운영 감사가 필요하면 로그인 성공/실패, 비밀번호 변경, 계정 연결 이벤트를 별도 audit_events로 남깁니다.
구현 전 체크
구현 전 체크
- oauth_accounts(provider, provider_user_id)에 UNIQUE를 둡니다.
- sessions.token_hash는 인덱싱하되 원문 토큰은 저장하지 않습니다.
- 만료된 인증/재설정 토큰은 주기적으로 정리합니다.
다른 ERD 예시
다른 ERD 예시
예시를 그대로 따라 그리거나, 가입 전 데모 캔버스에서 테이블과 관계를 먼저 만져볼 수 있습니다.