«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

Access Token과 Refresh Token에 대한 이해 본문

스터디

Access Token과 Refresh Token에 대한 이해

행복한 수지아빠 2025. 2. 12. 16:20

가입 및 로그인 과정에서 access_token과 refresh_token을 이용하는 방식은 보통 OAuth 2.0 및 JWT(JSON Web Token) 기반 인증 시스템에서 사용됩니다. 이를 단계별로 자세히 설명하겠습니다.


Auth Token Flow

1. 회원가입 (Sign Up)

회원가입 과정에서는 보통 access_token과 refresh_token이 사용되지 않습니다. 하지만 인증이 필요한 API에서는 사용될 수 있습니다.

  1. 사용자가 회원가입 요청
    • 사용자가 이메일, 비밀번호, 또는 소셜 로그인(Google, Facebook 등)을 사용하여 가입 요청을 보냄.
    • 요청 예시 (REST API):
      POST /api/auth/signup HTTP/1.1
      Content-Type: application/json
      
      {
        "email": "user@example.com",
        "password": "securepassword"
      }
      
  2. 서버에서 계정 생성 및 응답 반환
    • 비밀번호를 해시(Hash)하여 데이터베이스에 저장.
    • 이메일이 중복되지 않는지 확인.
    • 가입 성공 시, "회원가입 성공" 메시지를 반환.

2. 로그인 (Sign In)

로그인 과정에서 access_token과 refresh_token이 생성되고 사용됩니다.

(1) 로그인 요청

사용자가 이메일과 비밀번호를 입력하여 로그인 요청을 보냅니다.

POST /api/auth/login HTTP/1.1
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "securepassword"
}

(2) 서버에서 로그인 검증

  • 이메일과 비밀번호가 맞는지 확인.
  • 맞다면 access_token과 refresh_token을 생성하여 반환.
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "dGVzdC1yZWZyZXNoLXRva2Vu..."
}

3. Access Token과 Refresh Token의 역할

이제 access_token과 refresh_token의 역할을 설명하겠습니다.

(1) Access Token

  • API 요청을 보낼 때 사용.
  • 유효기간이 짧음 (예: 15~30분).
  • 만료되면 새 access_token이 필요함.

사용 예시 (API 요청 시 헤더에 포함)

GET /api/user/profile HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

(2) Refresh Token

  • access_token이 만료되었을 때, 새로운 access_token을 발급받는 용도로 사용.
  • 유효기간이 길다 (예: 7일~30일).
  • 보안 강화를 위해 주로 HTTP-only 쿠키로 저장.

4. Access Token 만료 시 재발급

access_token이 만료되면, refresh_token을 사용하여 새로운 access_token을 요청할 수 있습니다.

(1) Access Token이 만료됨

  • 사용자가 보호된 리소스를 요청했으나, 토큰이 만료됨.
GET /api/user/profile HTTP/1.1
Authorization: Bearer expired_access_token
  • 서버는 401 Unauthorized 응답을 반환.
{
  "error": "access_token expired"
}

(2) Refresh Token을 이용해 새 Access Token 요청

  • 클라이언트는 refresh_token을 서버에 보내서 새 access_token을 요청.
POST /api/auth/refresh HTTP/1.1
Content-Type: application/json

{
  "refresh_token": "valid_refresh_token"
}

(3) 서버에서 새로운 Access Token 발급

  • refresh_token이 유효한지 확인.
  • 새 access_token을 생성하여 반환.
{
  "access_token": "new_access_token"
}
  • 이후 클라이언트는 새로운 access_token을 사용하여 API 요청을 수행.

5. Refresh Token 만료 시 로그아웃 처리

refresh_token도 만료되었다면, 다시 로그인해야 합니다.

  1. Refresh Token이 만료되었을 때의 요청
POST /api/auth/refresh HTTP/1.1
Content-Type: application/json

{
  "refresh_token": "expired_refresh_token"
}
  1. 서버 응답 (401 Unauthorized)
{
  "error": "refresh_token expired, please log in again"
}
  1. 사용자는 다시 로그인해야 함.

6. 보안 고려사항

(1) Access Token과 Refresh Token 저장 위치

  • Access Token: 메모리 또는 sessionStorage (XSS 방어)
  • Refresh Token: HttpOnly 쿠키 (CSRF 방어)

(2) Refresh Token 탈취 방지

  • Refresh Token이 유출되면 위험하므로, 재사용 방지 기능을 구현.
  • Redis 또는 데이터베이스에 저장하여 한 번 사용된 refresh_token은 폐기.

(3) 토큰 무효화 (Logout)

  • 로그아웃 시 refresh_token을 삭제하여 무효화.
POST /api/auth/logout HTTP/1.1
Authorization: Bearer refresh_token
  • 서버에서는 DB에서 refresh_token을 삭제.

7. 정리

단계 클라이언트 서버

1. 회원가입 이메일/비밀번호 입력 후 요청 계정 생성 후 응답 반환
2. 로그인 이메일/비밀번호로 요청 access_token & refresh_token 발급
3. API 요청 access_token 포함하여 요청 검증 후 응답 반환
4. Access Token 만료 API 요청 시 401 응답 refresh_token으로 재발급 요청
5. Refresh Token 만료 재로그인 필요 새 로그인 요청

이제 블로그 형식으로 변환해서 내보낼까요? 😊