비밀번호 없이 이메일 링크만으로 로그인하는 매직링크 로그인의 동작 원리 이해하기!

구분 학습 내용
매직링크 이메일로 받은 일회용 링크를 클릭해 로그인하는 방식
로그인 토큰 매직링크에 포함되는 임시 인증 값
토큰 만료 일정 시간이 지나면 링크를 사용할 수 없게 만드는 정책
일회용 사용 한 번 사용된 링크는 다시 사용할 수 없게 만드는 정책
계정 존재 비노출 등록되지 않은 이메일 요청에도 같은 응답을 주는 정책
안전한 리다이렉트 로그인 후 이동할 경로가 외부 사이트가 아닌지 확인하는 정책

1단계. 매직링크 로그인은 “이메일 소유 확인”

매직링크 로그인은 사용자가 비밀번호를 입력하지 않습니다. 대신 서비스는 사용자의 이메일 주소로 일회용 로그인 링크를 보냅니다.

사용자는 이메일을 열고 링크를 클릭합니다. 서비스는 “이 이메일 계정에 접근할 수 있는 사람”이라고 판단하고 세션을 발급합니다.

%%{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: 서비스 화면으로 이동

이 방식의 핵심은 다음과 같습니다.

핵심 설명
이메일 소유 확인 이메일을 받을 수 있는 사람이 로그인할 수 있음
비밀번호 미사용 비밀번호 저장, 비밀번호 재설정 부담이 줄어듦
일회용 링크 링크가 유출되어도 재사용 가능성을 줄임
짧은 만료 시간 오래된 링크로 로그인하는 위험을 줄임

2단계. 매직링크 로그인 스펙 항목별 이해

단순한 “이메일 보내고 링크 클릭” 이상의 내부를 들여다 봅니다.

2-1. 로그인 요청

항목 스펙
요청 경로 POST /auth/magic-link/request
입력값 email, to
email 로그인하려는 이메일 주소
to 로그인 성공 후 이동할 내부 경로
성공 응답 “로그인 링크를 보낼 수 있는 경우 이메일을 발송했습니다.”
실패 응답 이메일 등록 여부를 드러내지 않도록 동일한 문구 사용

응답 문구는 등록 이메일과 미등록 이메일을 구분하지 않습니다.

{
  "message": "입력한 이메일로 로그인 링크를 보낼 수 있는 경우 메일이 발송됩니다."
}

이렇게 처리하는 이유는 간단합니다.

공격자가 이메일을 하나씩 입력하면서 “이 서비스에 가입된 이메일인지” 알아내는 것을 막기 위해서입니다.


2-2. 로그인 토큰 저장 규칙