주의: 이 글은 DB 설계에 대한 일반적인 접근 방식을 다루고 있습니다. 실제 프로젝트에 적용 시 요구사항과 상황에 맞게 적절히 수정하여 사용하세요.
현대의 웹 애플리케이션은 다양한 인증 방식을 지원해야 합니다. 이 글에서는 일반 로그인과 소셜 로그인을 동시에 지원하는 통합 인증 시스템의 데이터베이스 설계와 워크플로우를 설명합니다.
이 설계는 향후 2FA(Two-Factor Authentication)와 같은 추가적인 인증 체계를 쉽게 통합할 수 있는 확장성 있는 구조를 가지고 있습니다.
모든 사용자의 기본 정보를 저장합니다.
필드명 | 데이터 타입 | 제약 조건 | 설명 |
---|---|---|---|
idx | INT | PRIMARY KEY, AUTO_INCREMENT | 사용자의 고유 식별자 |
name | VARCHAR(100) | NOT NULL | 사용자 이름 |
VARCHAR(255) | NOT NULL, UNIQUE | 이메일 주소 | |
phone_number | VARCHAR(20) | NOT NULL, UNIQUE | 전화번호 |
created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 계정 생성 시간 |
지원하는 OAuth2 제공자(예: Google, Facebook, GitHub 등)의 정보를 관리합니다.
필드명 | 데이터 타입 | 제약 조건 | 설명 |
---|---|---|---|
idx | INT | PRIMARY KEY, AUTO_INCREMENT | 제공자의 고유 식별자 |
name | VARCHAR(50) | NOT NULL, UNIQUE | 제공자 이름 (예: "Google", "Facebook") |
activation | BOOLEAN | NOT NULL, DEFAULT TRUE | 해당 제공자의 활성화 상태 |
사용자와 OAuth2 제공자 간의 연결을 관리합니다.
필드명 | 데이터 타입 | 제약 조건 | 설명 |
---|---|---|---|
idx | INT | PRIMARY KEY, AUTO_INCREMENT | 연결의 고유 식별자 |
user_idx | INT | FOREIGN KEY (users.idx) | 사용자의 고유 식별자 |
provider_idx | INT | FOREIGN KEY (oauth2_providers.idx) | OAuth2 제공자의 고유 식별자 |
oauth2_user_id | VARCHAR(255) | NOT NULL | OAuth2 제공자에서 제공하는 사용자 ID |
created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 연동 생성 시간 |
UNIQUE KEY (user_idx, provider_idx)
일반 로그인에 사용되는 사용자의 ID와 비밀번호를 관리합니다.
필드명 | 데이터 타입 | 제약 조건 | 설명 |
---|---|---|---|
idx | INT | PRIMARY KEY, AUTO_INCREMENT | 자격 증명의 고유 식별자 |
user_idx | INT | FOREIGN KEY (users.idx) | 사용자의 고유 식별자 |
id | VARCHAR(50) | NOT NULL, UNIQUE | 사용자 로그인 ID |
password | VARCHAR(255) | NOT NULL | bcrypt로 해시된 비밀번호 |
last_updated | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 마지막 업데이트 시간 |
users
테이블에서 기존 사용자를 검색합니다.user_oauth_connections
테이블에서 해당 사용자와 OAuth2 제공자의 연결 정보를 확인합니다.user_oauth_connections
테이블에 새로운 연결 정보를 추가한 후 로그인을 진행합니다.users
테이블에 새로운 사용자 정보를 추가합니다.user_oauth_connections
테이블에 새로운 연결 정보를 추가합니다.user_credentials
테이블에서 입력된 ID와 일치하는 레코드를 찾습니다.users
테이블에 새로운 사용자 정보를 추가합니다.user_credentials
테이블에 ID와 해시된 비밀번호를 저장합니다.이 데이터베이스 구조와 인증 시스템은 다음과 같은 이점을 제공합니다:
oauth2_providers
테이블에 추가하는 것만으로 지원이 가능합니다.향후 2FA를 도입할 경우, 다음과 같은 테이블을 추가할 수 있습니다:
필드명 | 데이터 타입 | 제약 조건 | 설명 |
---|---|---|---|
idx | INT | PRIMARY KEY, AUTO_INCREMENT | 2FA 설정의 고유 식별자 |
user_idx | INT | FOREIGN KEY (users.idx), UNIQUE | 사용자의 고유 식별자 |
secret_key | VARCHAR(32) | NOT NULL | 2FA 비밀 키 |
is_enabled | BOOLEAN | NOT NULL, DEFAULT FALSE | 2FA 활성화 여부 |
created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 2FA 설정 시간 |
last_used_at | TIMESTAMP | NULL | 마지막 2FA 사용 시간 |
user_2fa
테이블에 사용자의 정보를 추가하고 is_enabled
를 TRUE로 설정합니다.user_2fa
테이블에서 해당 사용자의 2FA 활성화 여부를 확인합니다.이러한 구조를 통해 시스템의 확장성과 유지보수성을 높일 수 있으며, 향후 새로운 인증 요구사항에 유연하게 대응할 수 있습니다.