올해는 머신러닝이다.
Access Token과 Refresh Token에 대한 이해 본문
가입 및 로그인 과정에서 access_token과 refresh_token을 이용하는 방식은 보통 OAuth 2.0 및 JWT(JSON Web Token) 기반 인증 시스템에서 사용됩니다. 이를 단계별로 자세히 설명하겠습니다.
1. 회원가입 (Sign Up)
회원가입 과정에서는 보통 access_token과 refresh_token이 사용되지 않습니다. 하지만 인증이 필요한 API에서는 사용될 수 있습니다.
- 사용자가 회원가입 요청
- 사용자가 이메일, 비밀번호, 또는 소셜 로그인(Google, Facebook 등)을 사용하여 가입 요청을 보냄.
- 요청 예시 (REST API):
POST /api/auth/signup HTTP/1.1 Content-Type: application/json { "email": "user@example.com", "password": "securepassword" }
- 서버에서 계정 생성 및 응답 반환
- 비밀번호를 해시(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도 만료되었다면, 다시 로그인해야 합니다.
- Refresh Token이 만료되었을 때의 요청
POST /api/auth/refresh HTTP/1.1
Content-Type: application/json
{
"refresh_token": "expired_refresh_token"
}
- 서버 응답 (401 Unauthorized)
{
"error": "refresh_token expired, please log in again"
}
- 사용자는 다시 로그인해야 함.
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 만료 | 재로그인 필요 | 새 로그인 요청 |
이제 블로그 형식으로 변환해서 내보낼까요? 😊
'스터디' 카테고리의 다른 글
NestJS에서의 Fail2Ban란 (0) | 2025.02.12 |
---|---|
Cursor AI Rule에 대해 기초 정리 (0) | 2025.02.12 |
HTML의 img, picture, source 태그 속성과 기능 정리 (0) | 2025.02.11 |
MVVM / MVC(아키텍쳐)와 디자이패턴과 다른점은 무엇인가 (1) | 2025.02.07 |
지치지 않고 제대로 공부하는 7가지 방법 (0) | 2018.12.18 |