DevLog ๐Ÿ˜ถ

[Web] JWT๋ฅผ ํ†ตํ•œ ์ธ์ฆ ๊ณผ์ • ์•Œ์•„๋ณด๊ธฐ ๋ณธ๋ฌธ

โœ๏ธ/CS

[Web] JWT๋ฅผ ํ†ตํ•œ ์ธ์ฆ ๊ณผ์ • ์•Œ์•„๋ณด๊ธฐ

dolmeng2 2023. 5. 14. 18:48

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ…Œ์ฝ”ํ†ก์—์„œ ์ง„ํ–‰ํ–ˆ๋˜ ๋ฐœํ‘œ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค!

์ธ์ฆ๊ณผ ์ธ๊ฐ€, ์ฟ ํ‚ค / ์„ธ์…˜ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋Š” ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

[Web] ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ž€? - ์ฟ ํ‚ค์™€ ์„ธ์…˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ํ…Œ์ฝ”ํ†ก์—์„œ ์ง„ํ–‰ํ•œ ์ธ์ฆ๊ณผ ์ธ๊ฐ€ ๊ด€๋ จ ์ž๋ฃŒ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :D ๐ŸŒฑ ์ธ์ฆ (Authentication) ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์ด์ „์—, ๋“ฑ๋ก๋œ ์œ ์ €์˜ ์‹ ์›์„

cl8d.tistory.com

 


 

4. ํšจ์œจ์ ์œผ๋กœ ์ธ์ฆํ•˜๊ธฐ

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์„ธ์…˜์„ ํ†ตํ•ด์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜๋‹ค.

ํ•˜์ง€๋งŒ, ์„ธ์…˜ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ ์€ ์„œ๋ฒ„๋„, ํด๋ผ์ด์–ธํŠธ๋„, ๊ทธ๋ฆฌ๊ณ  ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€๊นŒ์ง€ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋‹ค์–‘ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋”ฐ๋กœ ๋‘์ง€ ์•Š๊ณ  ์š”์ฒญ๊ณผ ์‘๋‹ต ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค.

 

+) ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์—์„œ ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์ด ๋‚˜์˜จ ์ด์œ  ์ค‘์— ํ•˜๋‚˜๊ฐ€ DB์— ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„์„œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ๋„ ์žˆ๋‹ค๊ณ  ๋งŽ์ด๋“ค ๋งํ•œ๋‹ค. ์•”ํ˜ธํ™”๋œ ์ธ์ฆ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ด€๋ฆฌํ•จ์œผ๋กœ์„œ ๋ถ€ํ•˜๋ฅผ ์ค„์ธ๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ... ์‚ฌ์‹ค ๋ณด์•ˆ ์ธก๋ฉด์œผ๋กœ ๋ณด๋ฉด JWT ์—ญ์‹œ DB๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋‹ค ๋ณด๋‹ˆ๊นŒ ์ด๋Ÿฐ ๊ด€์ ์—์„œ๋Š” ํฌ๊ฒŒ ์ข‹์€์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. (๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ)

 

ํ† ํฐ ๋ฐฉ์‹์œผ๋กœ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ  'JWT (Json Web Token)'๊ฐ€ ์กด์žฌํ•œ๋‹ค.

JWT๋Š” ์ •๋ณด๋ฅผ Json ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๊ฒฐํ•˜๊ณ , ๋…๋ฆฝ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์ด๋‹ค. (RFC 7519)

๊ธฐ๋ณธ์ ์œผ๋กœ HMAC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์•”ํ˜ธํ™”๊ฐ€ ๋˜์–ด ์žˆ์œผ๋ฉฐ, RSA๋‚˜ ECDSA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณต๊ฐœ-๊ฐœ์ธํ‚ค ์Œ์„ ํ†ตํ•ด ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

JWT๋Š” ํฌ๊ฒŒ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ทธ๋‹ˆ์ฒ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

 

 

๐Ÿ’ฌ Header

ํ—ค๋”๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ† ํฐ ์œ ํ˜•๊ณผ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2๊ฐ€์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

{
  "alg": "HS256",
  "typ": "JWT"
}

๋งŒ์•ฝ ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋Š” ํ˜„์žฌ ํƒ€์ž…์€ JWT, ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ HS256์„ ์‚ฌ์šฉํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ด ์ •๋ณด๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ฒŒ ๋˜๋ฉด JWT์˜ ํ—ค๋” ๋ถ€๋ถ„์ด ์™„์„ฑ๋œ๋‹ค.

 

 

๐Ÿ’ฌ Payload

payload์€ claim ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, claim์€ entity์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ„๋‹ค. (์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด)

์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๋ณดํ†ต ์ด๊ณณ์— ๋“ค์–ด๊ฐ€์ง€๋งŒ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋„ฃ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ base64๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด payload์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

 

 

๐Ÿ’ฌ Signature

์ธ์ฝ”๋”ฉ๋œ ํ—ค๋” ๋ฐ ์ธ์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ, secret (๋น„๋ฐ€ ํ‚ค ์ •๋ณด), ํ—ค๋”์— ์ง€์ •๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ HMAC SHA256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ๋ช…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ •๋ณด๋Š” ๋„์ค‘์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐœ์ธํ‚ค๋กœ ์„œ๋ช…๋œ ํ† ํฐ์ด๋ผ๋ฉด JWT์˜ ๋ฐœ์‹ ์ž๊ฐ€ ๋ณธ์ธ์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š”๋ฐ๋„ ์‚ฌ์šฉ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ์ ์œผ๋กœ JWT๋Š” .์œผ๋กœ ๊ตฌ๋ถ„๋œ 3๊ฐœ์˜ Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์˜ ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ์—์„œ ํ™œ์šฉํ•  ๋•Œ์—๋Š” 'Bearer' ๋ผ๋Š” prefix๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Authorization ํ—ค๋”์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

Authorization: Bearer <token>

์ฐธ๊ณ ๋กœ, ๋‚˜์ค‘์— ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ํ•  ๋•Œ CORS ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์ธก์—์„œ exposedHeader ๊ฐ’์œผ๋กœ Authroization ํ—ค๋”๋ฅผ ํ—ˆ์šฉํ•ด์ค˜์•ผ ํ•œ๋‹ค. (์ด๊ฑฐ๋Š” ๋‹ค์Œ์— ํฌ์ŠคํŒ…์„ ๋”ฐ๋กœ ํ•ด๋ณด๊ฒ ๋‹ค ใ…Žใ…Ž)

 

์‹ค์ œ๋กœ ํ•™์Šต ํ…Œ์ŠคํŠธ์—์„œ ์‚ดํŽด๋ณด์•˜๋˜ ํ† ํฐ ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

public String createToken(String payload) {
    Claims claims = Jwts.claims().setSubject(payload);
    Date now = new Date();
    Date validity = new Date(now.getTime() + validityInMilliseconds);

    return Jwts.builder()
            .setClaims(claims)
            .setIssuedAt(now)
            .setExpiration(validity)
            .signWith(SignatureAlgorithm.HS256, secretKey)
            .compact();
}

์ฝ”๋“œ๋ฅผ ๊ฐ๊ฐ ๋ถ„์„ํ•ด๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด claim์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ง€์ • ๋ฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ์‹œํฌ๋ฆฟํ‚ค๋ฅผ ํ†ตํ•œ ์•”ํ˜ธํ™”๋ฅผ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ํ•ด๋‹น ํ† ํฐ์„ ๋‹ค์‹œ ํ•ด๋…ํ•  ๋•Œ๋Š” ์„œ๋ฒ„ ๋‚ด์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์‹œํฌ๋ฆฟํ‚ค๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋…ํ•œ๋‹ค.

public String getPayload(String token) {
    return Jwts.parser()
        .setSigningKey(secretKey)
        .parseClaimsJws(token)
        .getBody()
        .getSubject();
}

๐Ÿ’ก ์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์ฃผ๋ชฉํ•  ์ ์ด ์žˆ๋‹ค.
parseClaimsJws()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๊ฑฐ ๋Œ€์‹ ์— parseClaimsJwt()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์ด๋Š”, ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ์— ํ† ํฐ์„ ์ƒ์„ฑํ•  ๋•Œ signWith์„ ํ†ตํ•ด์„œ ์„œ๋ช…์„ ์ง„ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณตํ˜ธํ™” ์‹œ์—๋„ ์„œ๋ช…์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (Jwt()์˜ ๊ฒฝ์šฐ ์„œ๋ช… ๊ฒ€์ฆ ์—†์ด ๋‹จ์ˆœํžˆ ํ—ค๋”์™€ ํด๋ ˆ์ž„๋งŒ ์ถ”์ถœํ•จ)
parseClaimsJwt()์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ† ํฐ ์ƒ์„ฑ ์‹œ์— signWith์„ ํ†ตํ•ด์„œ ์„œ๋ช…์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค.

 

 

๐Ÿ’ฌ ๋™์ž‘ ๋ฐฉ์‹ ์•Œ์•„๋ณด๊ธฐ

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ƒ์„ฑ๋œ ํ† ํฐ์„ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ์‹์€ ๋‹ค์–‘ํ•œ๋ฐ, ๋‚˜๋Š” ์œ„์™€ ๊ฐ™์ด Authorization ํ—ค๋”์— ๋‹ด์•„์„œ ๋‚ด๋ ค์คฌ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ๊ฐ’์„ ๋ฐ›์•„์„œ ๋‹ค์Œ ์š”์ฒญ ์‹œ Authorization ํ—ค๋”์— JWT ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋„ฃ์–ด์„œ ๋ณด๋‚ด๋Š”๋ฐ, ์„œ๋ฒ„๋Š” ํ•ด๋‹น ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜์˜€๋˜ ์‹œํฌ๋ฆฟํ‚ค ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์‹œ ๋””์ฝ”๋”ฉ ํ›„์— ๋‚ด๋ถ€์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ธ์ฆ์„ ์ง„ํ–‰ํ•œ๋‹ค.

 

 

๐Ÿ’ฌ ์žฅ์  / ๋‹จ์ 

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„ ์ธก์—์„œ ๋”ฐ๋กœ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์— ๋Œ€ํ•ด ํ—ค๋” ๊ฐ’์— ํ•จ๊ป˜ ํฌํ•จ์‹œ์ผœ ๋ณด๋‚ด์ฃผ๋ฉด ๋œ๋‹ค.

๋˜ํ•œ, MSA ๊ฐ™์€ ๊ตฌ์กฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€์ธ ์ƒํ™ฉ์ด๋ผ๋ฉด ๊ฐ™์€ ํ† ํฐ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ์ธ์ฆ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ํšจ์œจ์ ์ด๋‹ค.

(์ด์ „์— ๋ดค๋˜ ์„ธ์…˜ ์ธ์ฆ ๋ฐฉ์‹์—์„œ๋Š” ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ ๊ฐ™์€ ๊ฒƒ์„ ๋‘์—ˆ์—ˆ๋Š”๋ฐ, ์ด๋Ÿฐ ์ ์—์„œ๋Š” ์ข‹๋‹ค ใ…Žใ…Ž)

 

ํ•˜์ง€๋งŒ, JWT์˜ ๊ฒฝ์šฐ ํƒˆ์ทจ ๋‹นํ•œ๋‹ค๋ฉด ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

ํƒˆ์ทจ๋‹นํ•œ JWT์˜ ๊ฒฝ์šฐ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๊ฐ•์ œ๋กœ ๋งŒ๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ •๋ณด๋ฅผ ๋ฐ”๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜์— ๋น„ํ•ด์„œ๋Š” ๋ณด์•ˆ์  ์ธก๋ฉด์—์„œ๋Š” ๋–จ์–ด์ง„๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (๋ฌผ๋ก , ํ•ด๋‹น ํ† ํฐ์˜ claim ์ •๋ณด๊ฐ€ ์•…์„ฑ ์‚ฌ์šฉ์ž์ž„์„ ํ™•์‹คํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์€ ์ฐจ๋‹จํ•˜๋Š” ํ˜•ํƒœ๋กœ๋Š” ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.) ๊ทธ๋ž˜์„œ ์€ํ–‰ ๊ฐ™์€ ๋ณด์•ˆ์ด ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์„ธ์…˜์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋‹ค. (๋‡Œํ”ผ์…œ)

 

 

๐Ÿ’ฌ Refresh Token

๋ณดํ†ต ํƒˆ์ทจ ๋ฌธ์ œ๋กœ ์ธํ•ด์„œ JWT (์ด์ œ๋Š” 'access token'์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ๋‹ค.)์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š” ํŽธ์ด๋ฉฐ (30๋ถ„ ์ •๋„), ๊ธฐํ•œ์ด ์งง์œผ๋ฉด ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด 'refresh token'์ด๋ผ๋Š” ๊ฒƒ์„ ๋”ฐ๋กœ ๋‘๊ธฐ๋„ ํ•œ๋‹ค.

access token์— ๋Œ€ํ•œ ์žฌ๋ฐœ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ฑ…์ž„์ง€๋Š” token์ด๋ฉฐ,  ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ  (์„ธ์…˜์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, in-memory db์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ), ํƒˆ์ทจ๋ฅผ ๋‹นํ•˜๋”๋ผ๋„ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ refresh token์„ ๊ฐ•์ œ๋กœ ์ œ๊ฑฐํ•˜์—ฌ ๋ณด์•ˆ์— ๋Œ€ํ•ด์„œ๋„ ์•ˆ์ •์„ฑ์ด ๋†’์€ ํ† ํฐ์ด๋‹ค.

 

๋ณดํ†ต refresh token์˜ ๊ฒฝ์šฐ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ผ์ฃผ์ผ~์ด์ฃผ์ผ ์ •๋„๋กœ ๋งŒ๋“ค์–ด๋‘”๋‹ค.

์‚ฌ์‹ค ์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€๋Š” ๊ฐœ๋ฐœ์ž์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅด์ง€๋งŒ, ๋ณดํ†ต ์ด๋Ÿฐ ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์œ„์—์„œ ์ž‘์„ฑํ•œ ๊ทธ๋ฆผ๊ณผ ์ด์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž.

 

์—ฌ๊ธฐ์„œ ๋ฐ›์€ ํ† ํฐ ์ •๋ณด์— ๋”ฐ๋ผ์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šคํ…์ด ๋‚˜๋ˆ„์–ด์ง€๋Š”๋ฐ, ๋ณดํ†ต ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ€์ด์Šค๋“ค๋กœ ๋‚˜๋‰œ๋‹ค.

 

 

๋ฌผ๋ก  ์—ฌ๊ธฐ์„œ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

๋กœ์ง์ด ์ƒ๋‹นํžˆ ๋ณต์žกํ•ด์กŒ์ง€๋งŒ, access token์˜ ๋‹จ์ ์„ ๊ทธ๋‚˜๋งˆ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์งง์€ access token์˜ ์œ ํšจ์‹œ๊ฐ„์— ๋Œ€์ฒ˜ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ sliding session์ด๋ผ๋Š” ์นœ๊ตฌ๋„ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์†ํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด (JS์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๊ฐ์ง€) access token์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์— ์ƒˆ๋กœ์šด access token์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•œ ํ† ํฐ์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฑด ๊ตฌํ˜„ํ•ด๋ณธ ์ ์ด ์—†์–ด์„œ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ... ์•„๋ฌด๋ž˜๋„ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๊ณ„์† ํ™•์ธํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

Comments