๐Ÿ”Access Token ๋ฐ Refresh Token๐Ÿ”‘

2626 ๋‹จ์–ด

์ด ๊ฒŒ์‹œ๋ฌผ์€ ์•ก์„ธ์Šค ํ† ํฐ ๋ฐ ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์—ฐ์Šต์ž…๋‹ˆ๋‹ค. ์•ˆ์ „๋ฒจํŠธ๋ฅผ ๋งค๊ณ  ๋จผ์ € ํ† ํฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.๐Ÿ˜Š

๊ทธ๋ ‡๋‹ค๋ฉด ํ† ํฐ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

์•ก์„ธ์Šค ํ† ํฐ๊ณผ ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๋ฏธ์ง€ ์ถœ์ฒ˜: google.com

๊ฐฑ์‹  ํ† ํฐ์€ ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ˆ˜๋ช…์ด ๊ธด ํ† ํฐ(OAuth2์˜ JWT)์ž…๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ํ† ํฐ์„ ์ฒ˜์Œ ๋ฐ›์œผ๋ฉด ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ๋„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ํ† ํฐ์€ ์ˆ˜๋งŽ์€ ์ทจ์•ฝ์ ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ๋ฉฐ์น  ๋˜๋Š” ๋ช‡ ๋‹ฌ์ด ์•„๋‹Œ ๋ช‡ ์‹œ๊ฐ„์œผ๋กœ ์ œํ•œ๋˜์–ด ์ˆ˜๋ช…์ด ์งง์Šต๋‹ˆ๋‹ค.

generateTokens(payload){
        const accessToken = jwt.sign(payload, JWT_ACCESS_TOKEN_SECRET,{
            expiresIn: '1h'
        })
        const refreshToken = jwt.sign(payload, JWT_REFRESH_TOKEN_SECRET,{
            expiresIn: '1y'
        })
        return {accessToken, refreshToken}
};



์—ฌ๊ธฐ์—์„œ generateTokens ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ์ž ID์ธ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. jwt.sign() ํ•จ์ˆ˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ ํ•œ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐ›์€ ์•ก์„ธ์Šค ํ† ํฐ๊ณผ ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์ด ์œ ํšจํ•œ ์‹œ๊ฐ„์„ ์ •์˜ํ•˜๋Š” expiresIn์ด๋ผ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์˜๋„ํ•œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ์•ก์„ธ์Šค ํ† ํฐ์ด ํฌํ•จ๋œ API ์š”์ฒญ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

HTTP/1.1 401 Unauthorized



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

์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์€ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒˆ๋กœ ๊ณ ์น˜์ง€ ์•Š์ง€๋งŒ ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์„ ํ™•์ธํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ƒˆ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์•ก์„ธ์Šค ํ† ํฐ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ์ž‘์—…์„ ๊ณ„์†ํ•˜๊ณ  ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋ชจ๋‘ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์€ ์ƒˆ๋กœ ์•ก์„ธ์Šค ํ† ํฐ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

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

๊ฐ์‚ฌ.

์ž์›

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://oauth.net/articles/authentication/

https://auth0.com/docs/best-practices/token-best-practices

https://auth0.com/docs/tokens/json-web-tokens/json-web-token-structure

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ