[Etc] ๐ Access Token๊ณผ Refresh Token ์๋ฒฝ ์ ๋ฆฌ
OAuth 2.0์ ์ฌ์ฉํ ๋ ํต์ฌ์ธ Access Token๊ณผ Refresh Token์ ๋ํด ์์๋ณด์.
- Access Token๊ณผ Refresh Token์ด๋?
- Access Token
- Refresh Token
- Access Token vs. Refresh Token ๋น๊ต
- Access Token๊ณผ Refresh Token์ ์ฌ์ฉํ๋ ์ด์
- Access Token๊ณผ Refresh Token์ ํ์ฉํ ์ธ์ฆ ํ๋ฆ
- Access Token & Refresh Token ๋ณด์ ๊ณ ๋ ค ์ฌํญ
- ์ค์ ์ฝ๋ ๊ตฌํ (Java, Spring Security)
1. Access Token๊ณผ Refresh Token์ด๋?
OAuth 2.0์ ์ฌ์ฉํ ๋ ํต์ฌ์ด ๋๋ ํ ํฐ
ํ ํฐ ์ข ๋ฅ | ์ญํ | ์ ํจ ๊ธฐ๊ฐ | ์ฌ์ฉ ๋ชฉ์ |
---|---|---|---|
Access Token | API ์์ฒญ ์ ์ธ์ฆ์ ์ํ ํ ํฐ | ์งง์ (๋ช ๋ถ~1์๊ฐ) | ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋ ํ API ์ ๊ทผ |
Refresh Token | Access Token์ด ๋ง๋ฃ๋์์ ๋ ์ ํ ํฐ ๋ฐ๊ธ | ๊น (๋ฉฐ์น ~๋ช ๋ฌ) | Access Token์ ๊ฐฑ์ |
2. Access Token
โ Access Token์ด๋?
- ์ฌ์ฉ์๊ฐ OAuth ์ธ์ฆ์ ๋ง์น๋ฉด Authorization Server๊ฐ ๋ฐ๊ธํ๋ ๋จ๊ธฐ ์ ํจ ํ ํฐ.
- ์ด ํ ํฐ์ API ์์ฒญ์ Authorization ํค๋์ ํฌํจํ์ฌ ์ฌ์ฉ.
- ์ผ๋ฐ์ ์ผ๋ก Bearer Token ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋จ.
๐ฏ Access Token ์ฌ์ฉ ์์
HTTP ์์ฒญ์์ Access Token์ ํฌํจํ์ฌ API ํธ์ถ:
GET /user/profile HTTP/1.1
Host: api.example.com
Authorization: Bearer ACCESS_TOKEN
โณ Access Token์ ์ ํจ ๊ธฐ๊ฐ
- ๋ณด์์ ์งง์ ์๊ฐ(๋ช ๋ถ~1์๊ฐ ์ ๋) ๋ง ์ ์ง๋จ.
- Access Token์ด ๋ง๋ฃ๋๋ฉด ๋ ์ด์ API๋ฅผ ํธ์ถํ ์ ์์.
- ํด๊ฒฐ ๋ฐฉ๋ฒ: Refresh Token์ ์ฌ์ฉํ์ฌ ์๋ก์ด Access Token ๋ฐ๊ธ.
3. Refresh Token
โ Refresh Token์ด๋?
- Access Token์ด ๋ง๋ฃ๋์์ ๋, ์๋ก์ด Access Token์ ์์ฒญํ ์ ์๋๋ก ์ ๊ณต๋๋ ์ฅ๊ธฐ ํ ํฐ.
- Access Token๊ณผ ๋ค๋ฅด๊ฒ, Refresh Token ์์ฒด๋ก๋ API ์์ฒญ์ ๋ณด๋ผ ์ ์์.
- ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๋ก๊ทธ์ธํ์ง ์๊ณ ๋ ์ธ์ฆ์ ์ฐ์ฅํ ๋ ์ฌ์ฉ.
๐ฏ Refresh Token ์ฌ์ฉ ์์
Access Token์ด ๋ง๋ฃ๋๋ฉด, Refresh Token์ ์ด์ฉํ์ฌ ์ Access Token์ ์์ฒญ:
POST /auth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET&
refresh_token=YOUR_REFRESH_TOKEN
โณ Refresh Token์ ์ ํจ ๊ธฐ๊ฐ
- ๋ฉฐ์น ~๋ช ๋ฌ๊น์ง ์ ์ง ๊ฐ๋ฅ (๋ณด์ ์ ์ฑ ์ ๋ฐ๋ผ ๋ค๋ฆ).
- ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๊ธฐ ๋ณ๊ฒฝ, ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ, ๋ณด์ ์ํ ๊ฐ์ง ์ ๊ฐ์ ๋ง๋ฃ๋จ.
4. Access Token vs. Refresh Token ๋น๊ต
ย | Access Token | Refresh Token |
---|---|---|
๋ชฉ์ | API ์์ฒญ ์ธ์ฆ | ์๋ก์ด Access Token ๋ฐ๊ธ |
์ ํจ ๊ธฐ๊ฐ | ์งง์ (๋ช ๋ถ~1์๊ฐ) | ๊น (๋ฉฐ์น ~๋ช ๋ฌ) |
๋ณด๊ด ์์น | ํด๋ผ์ด์ธํธ ์ ์ฅ | ํด๋ผ์ด์ธํธ ์ ์ฅ (๋ณด์ ํ์) |
๋ณด์ ์ํ | ํ์ทจ๋๋ฉด API ๋ฌด๋จ ์ ๊ทผ ๊ฐ๋ฅ | ํ์ทจ๋๋ฉด ์๋ก์ด Access Token ๋ฐ๊ธ ๊ฐ๋ฅ |
์ฌ์ฉ ๊ฐ๋ฅ ํ์ | ์ฌ๋ฌ ๋ฒ API ์์ฒญ ๊ฐ๋ฅ | 1ํ ๋๋ ์ ํ์ ์ฌ์ฉ |
5. Access Token๊ณผ Refresh Token์ ์ฌ์ฉํ๋ ์ด์
Access Token๋ง ์ฌ์ฉํ๋ฉด?
- ๋ณด์์ ์ ํจ ๊ธฐ๊ฐ์ ๊ธธ๊ฒ ์ค์ ํ ์ ์์.
- ํ ํฐ์ด ๋ง๋ฃ๋ ๋๋ง๋ค ์ฌ์ฉ์๊ฐ ๋ค์ ๋ก๊ทธ์ธํด์ผ ํจ โ ๋ถํธํจ.
Refresh Token์ ์ถ๊ฐํ๋ฉด?
- Access Token์ ์์ฃผ ๊ฐฑ์ ํ ์ ์์ โ ๋ณด์ ๊ฐํ.
- ์ฌ์ฉ์๊ฐ ๋ค์ ๋ก๊ทธ์ธํ ํ์ ์์ด ์๋์ผ๋ก ์ธ์ฆ ์ฐ์ฅ ๊ฐ๋ฅ.
๐ Refresh Token์ ์ฌ์ฉํ๋ฉด ๋ณด์๊ณผ ์ฌ์ฉ์ ํธ์์ฑ ๋ชจ๋ ํฅ์๋จ.
6. Access Token๊ณผ Refresh Token์ ํ์ฉํ ์ธ์ฆ ํ๋ฆ
1๏ธโฃ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ & ๊ถํ ๋ถ์ฌ
โ OAuth ์๋ฒ๊ฐ Access Token๊ณผ Refresh Token ๋ฐ๊ธ
2๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ API ์์ฒญ
โ Authorization: Bearer Access_Token
ํฌํจํ์ฌ ์์ฒญ
3๏ธโฃ Access Token์ด ๋ง๋ฃ๋จ
โ API ์๋ฒ๊ฐ 401 Unauthorized ์๋ต ๋ฐํ
4๏ธโฃ Refresh Token์ ์ฌ์ฉํด ์ Access Token ์์ฒญ
โ ์ Access Token ๋ฐ๊ธ ํ ๋ค์ API ์์ฒญ ๊ฐ๋ฅ
5๏ธโฃ Refresh Token๋ ๋ง๋ฃ๋จ
โ ์ฌ์ฉ์๋ ๋ค์ ๋ก๊ทธ์ธ ํ์
๐ Access Token์ API ์์ฒญ์ ์ธ์ฆํ๋ ์ฉ๋, Refresh Token์ ์๋ก์ด Access Token์ ๋ฐ๊ธํ๋ ์ฉ๋!
๐ ๋ณด์์ด ์ค์ํ ๋งํผ ์ ์ฅ ๋ฐฉ์๊ณผ ์ ํจ ๊ธฐ๊ฐ์ ์ ๊ด๋ฆฌํด์ผ ํจ! ๐
7. Access Token & Refresh Token ๋ณด์ ๊ณ ๋ ค ์ฌํญ
โ Access Token ๋ณด์
- ์ ํจ ๊ธฐ๊ฐ์ ์งง๊ฒ ์ค์ (๋ช ๋ถ~1์๊ฐ)
- HTTPS ์ฌ์ฉ ํ์ (๋คํธ์ํฌ ์ค๋ํ ๋ฐฉ์ง)
- ํ์ทจ๋๋ฉด API ์ ๊ทผ ๊ฐ๋ฅ โ ์งง์ ์ ํจ ๊ธฐ๊ฐ์ด ๋ณด์์ฑ์ ๋ณด์ฅ
โ Refresh Token ๋ณด์
- ๋ณด์ ์ ์ฅ์ ์ฌ์ฉ (์: ๋ชจ๋ฐ์ผ ์ฑ์์๋ Secure Storage)
- HTTP ์์ฒญ ์ ๋ ธ์ถ๋์ง ์๋๋ก ์ฃผ์ (์ฟ ํค ๋๋ ์์ ํ ์ ์ฅ์์ ๋ณด๊ด)
- ์ ์ถ ์ ์ฆ์ ๋ฌดํจํ ํ์ (์๋ฒ์์ ํ ํฐ ๋ฌดํจํ ๊ธฐ๋ฅ ์ถ๊ฐ)
๐จ ํ์ทจ ๋ฐฉ์ง ๋ฐฉ๋ฒ
- Refresh Token์ ํด๋ผ์ด์ธํธ์์ ์์ ํ๊ฒ ์ ์ฅ
- ๋ธ๋ผ์ฐ์ : HttpOnly Secure Cookie ์ฌ์ฉ
- ๋ชจ๋ฐ์ผ ์ฑ: Secure Storage / Keychain ์ฌ์ฉ
- Refresh Token ์ฌ์ฌ์ฉ ๋ฐฉ์ง (One-Time Refresh Token)
- Refresh Token์ ์ฌ์ฉํ ๋๋ง๋ค ์ Refresh Token์ ๋ฐ๊ธํ๊ณ ์ด์ ๊ฒ์ ๋ฌดํจํ
- IP & ๋๋ฐ์ด์ค ๊ฒ์ฆ
- Refresh Token ์ฌ์ฉ ์ IP ์ฃผ์์ ๋๋ฐ์ด์ค ์ ๋ณด๋ฅผ ํ์ธํ์ฌ ์ด์ ๊ฐ์ง ์ ๋ฌดํจํ
- ํ ํฐ ์ํธํ ๋ฐ ์๋ช
- JWT ๊ธฐ๋ฐ Access Token์ ์๋ช (Signature) ์ ํฌํจํ์ฌ ์๋ณ์กฐ ๋ฐฉ์ง
8. Access Token & Refresh Token ์ค์ ์ฝ๋ ๊ตฌํ (Java, Spring Security)
๐น Access Token & Refresh Token ๋ฐ๊ธ API ์์ (Spring Boot)
@RestController
@RequestMapping("/auth")
public class AuthController {
@PostMapping("/token")
public ResponseEntity<?> getToken(@RequestParam String refreshToken) {
if (isValidRefreshToken(refreshToken)) {
String newAccessToken = generateNewAccessToken();
return ResponseEntity.ok(newAccessToken);
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid Refresh Token");
}
}
private boolean isValidRefreshToken(String token) {
// Refresh Token ๊ฒ์ฆ ๋ก์ง
return token.equals("valid-refresh-token"); // ์์ ์ฝ๋
}
private String generateNewAccessToken() {
// ์๋ก์ด Access Token ์์ฑ (JWT ์ฌ์ฉ ๊ฐ๋ฅ)
return UUID.randomUUID().toString();
}
}