비밀번호 없이 이메일 링크만으로 로그인하는 매직링크 로그인의 동작 원리 이해하기!
| 구분 | 학습 내용 |
|---|---|
| 매직링크 | 이메일로 받은 일회용 링크를 클릭해 로그인하는 방식 |
| 로그인 토큰 | 매직링크에 포함되는 임시 인증 값 |
| 토큰 만료 | 일정 시간이 지나면 링크를 사용할 수 없게 만드는 정책 |
| 일회용 사용 | 한 번 사용된 링크는 다시 사용할 수 없게 만드는 정책 |
| 계정 존재 비노출 | 등록되지 않은 이메일 요청에도 같은 응답을 주는 정책 |
| 안전한 리다이렉트 | 로그인 후 이동할 경로가 외부 사이트가 아닌지 확인하는 정책 |
매직링크 로그인은 사용자가 비밀번호를 입력하지 않습니다. 대신 서비스는 사용자의 이메일 주소로 일회용 로그인 링크를 보냅니다.
사용자는 이메일을 열고 링크를 클릭합니다. 서비스는 “이 이메일 계정에 접근할 수 있는 사람”이라고 판단하고 세션을 발급합니다.
%%{init: {
"theme": "base",
"themeVariables": {
"primaryColor": "#E0F2FE",
"primaryBorderColor": "#0284C7",
"primaryTextColor": "#0F172A",
"lineColor": "#64748B",
"secondaryColor": "#ECFDF5",
"tertiaryColor": "#FFF7ED",
"fontFamily": "Pretendard, Inter, Arial"
}
}}%%
sequenceDiagram
autonumber
participant U as 사용자
participant W as 웹 서비스
participant DB as 데이터베이스
participant M as 메일 발송 서비스
participant B as 브라우저 세션
U->>W: 이메일 입력 후 로그인 요청
W->>DB: 등록된 사용자 여부 확인
W->>DB: 일회용 로그인 토큰 저장<br/>만료시간과 사용 여부 함께 기록
W->>M: 매직링크 이메일 발송 요청
M-->>U: 이메일 도착<br/>로그인 링크 포함
U->>W: 이메일 링크 클릭
W->>DB: 토큰 유효성 검증<br/>존재, 만료, 미사용 여부 확인
W->>DB: 토큰 사용 처리<br/>재사용 방지
W->>B: 세션 쿠키 발급
W-->>U: 서비스 화면으로 이동
이 방식의 핵심은 다음과 같습니다.
| 핵심 | 설명 |
|---|---|
| 이메일 소유 확인 | 이메일을 받을 수 있는 사람이 로그인할 수 있음 |
| 비밀번호 미사용 | 비밀번호 저장, 비밀번호 재설정 부담이 줄어듦 |
| 일회용 링크 | 링크가 유출되어도 재사용 가능성을 줄임 |
| 짧은 만료 시간 | 오래된 링크로 로그인하는 위험을 줄임 |
단순한 “이메일 보내고 링크 클릭” 이상의 내부를 들여다 봅니다.
| 항목 | 스펙 |
|---|---|
| 요청 경로 | POST /auth/magic-link/request |
| 입력값 | email, to |
email |
로그인하려는 이메일 주소 |
to |
로그인 성공 후 이동할 내부 경로 |
| 성공 응답 | “로그인 링크를 보낼 수 있는 경우 이메일을 발송했습니다.” |
| 실패 응답 | 이메일 등록 여부를 드러내지 않도록 동일한 문구 사용 |
응답 문구는 등록 이메일과 미등록 이메일을 구분하지 않습니다.
{
"message": "입력한 이메일로 로그인 링크를 보낼 수 있는 경우 메일이 발송됩니다."
}
이렇게 처리하는 이유는 간단합니다.
공격자가 이메일을 하나씩 입력하면서 “이 서비스에 가입된 이메일인지” 알아내는 것을 막기 위해서입니다.