[Etc] ๐Ÿ”‘ Access Token๊ณผ Refresh Token ์™„๋ฒฝ ์ •๋ฆฌ

OAuth 2.0์„ ์‚ฌ์šฉํ• ๋•Œ ํ•ต์‹ฌ์ธ Access Token๊ณผ Refresh Token์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.


1. Access Token๊ณผ Refresh Token์ด๋ž€?

OAuth 2.0์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•ต์‹ฌ์ด ๋˜๋Š” ํ† ํฐ

ํ† ํฐ ์ข…๋ฅ˜์—ญํ• ์œ ํšจ ๊ธฐ๊ฐ„์‚ฌ์šฉ ๋ชฉ์ 
Access TokenAPI ์š”์ฒญ ์‹œ ์ธ์ฆ์„ ์œ„ํ•œ ํ† ํฐ์งง์Œ (๋ช‡ ๋ถ„~1์‹œ๊ฐ„)์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋œ ํ›„ API ์ ‘๊ทผ
Refresh TokenAccess 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 TokenRefresh 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 ์š”์ฒญ ์‹œ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ (์ฟ ํ‚ค ๋˜๋Š” ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ์— ๋ณด๊ด€)
  • ์œ ์ถœ ์‹œ ์ฆ‰์‹œ ๋ฌดํšจํ™” ํ•„์š” (์„œ๋ฒ„์—์„œ ํ† ํฐ ๋ฌดํšจํ™” ๊ธฐ๋Šฅ ์ถ”๊ฐ€)

๐Ÿšจ ํƒˆ์ทจ ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•

  1. Refresh Token์„ ํด๋ผ์ด์–ธํŠธ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ
    • ๋ธŒ๋ผ์šฐ์ €: HttpOnly Secure Cookie ์‚ฌ์šฉ
    • ๋ชจ๋ฐ”์ผ ์•ฑ: Secure Storage / Keychain ์‚ฌ์šฉ
  2. Refresh Token ์žฌ์‚ฌ์šฉ ๋ฐฉ์ง€ (One-Time Refresh Token)
    • Refresh Token์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ Refresh Token์„ ๋ฐœ๊ธ‰ํ•˜๊ณ  ์ด์ „ ๊ฒƒ์€ ๋ฌดํšจํ™”
  3. IP & ๋””๋ฐ”์ด์Šค ๊ฒ€์ฆ
    • Refresh Token ์‚ฌ์šฉ ์‹œ IP ์ฃผ์†Œ์™€ ๋””๋ฐ”์ด์Šค ์ •๋ณด๋ฅผ ํ™•์ธํ•˜์—ฌ ์ด์ƒ ๊ฐ์ง€ ์‹œ ๋ฌดํšจํ™”
  4. ํ† ํฐ ์•”ํ˜ธํ™” ๋ฐ ์„œ๋ช…
    • 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();
    }
}