- ํ ํฐ์ ๊ฐ๋ (Refresh Token๊ณผ Access Token์ ์ฐจ์ด)
- ์ฟ ํค / ์ธ์ ๋ฐฉ์๊ณผ ํ ํฐ ๋ฐฉ์์ ์ฐจ์ด
- JWT์ ์๋์๋ฆฌ
- header, payload, signature์ ์ญํ
- JWT๊ฐ ์ด๋ป๊ฒ ํ ํฐ์ ๋ณ์กฐ๋ฅผ ํ๋ณํ๋ ์ง
- ํ ํฐ ๋ฐฉ์์ ํ๊ณ
- Authentication๊ณผ Authorization์ ์ฐจ์ด
- Authorization Code์ Access Token์ ์ฐจ์ด
- Authorization ์๋ฒ์ Resource ์๋ฒ์ ์ฐจ์ด์ ๋ํด ์ดํดํ ์ ์๋ค.
ํ ํฐ ๊ธฐ๋ฐ
์๋ฒ๋ db์ ์ ์ ์ ๋ณด๋ฅผ ๋ด๋ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์ ๋ณด์ํ ๋ฐฉ์
ํ ํฐ์ ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณด๊ดํ๋ค.
์ฌ๊ธฐ์ ํ ํฐ์ ์ ์ ์ ๋ณด๋ฅผ ์ํธํํ ์ํ๋ก ๋ด์ ์ ์๊ณ , ์ํธํํ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ๋ด์ ์ ์๋ค.
๋ํ์ ์ธ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ => JWT (JSON WEB TOKEN)
header
- ์ด๋ค ์ข ๋ฅ์ ํ ํฐ์ธ๊ฐ?
- ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํ ํ๋๊ฐ?
{
"typ": "JWT",
"alg": "HS256"
}
์ด JSON ๊ฐ์ฒด๋ฅผ base64 ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํ๋ฉด JWT์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ธ Header๊ฐ ์์ฑ๋๋ค.
payload (์ํธํ๋์ง๋ง ๊ทธ๋๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ No! ๋์ฝ๋ฉ์ด ์ฝ๋ค.)
- ์ ์ ์ ์ ๋ณด
- ๊ถํ์ ๋ถ์ฌ ๋ฐ์๋๊ฐ?
- ๊ธฐํ ํ์ํ ์ ๋ณด
{
"iss": "velopert.com",
"exp": "1485270000000",
"https://velopert.com/jwt_claims/is_admin": true,
"userId": "11028373727102",
"username": "velopert"
}
์ด JSON ๊ฐ์ฒด๋ฅผ base64 ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํ๋ฉด JWT์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ธ Payload๊ฐ ์์ฑ๋๋ค.
signature
- header, payload๋ฅผ base64 ์ธ์ฝ๋ฉํ ๊ฐ๊ณผ salt๊ฐ์ ์กฐํฉ์ผ๋ก ์ํธํ๋ ๊ฐ
base64 ์ธ์ฝ๋ฉ์ ๋๊ตฌ๋ ์ฝ๊ฒ ๋์ฝ๋ฉํ ์ ์์ด์ Header & Payload ๋ ์ฝ๊ฒ ํ์ธ ๊ฐ๋ฅํ์ง๋ง, ๋น๋ฐํค๋ฅผ ์ด์ฉํด์ ์ํธํํ signature๋ ๋น๋ฐํค๋ฅผ ๋ณด์ ํ๊ฒ ์๋๋ผ๋ฉด ๋์ฝ๋ฉ์ด ์ด๋ ต๋ค.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์ค ๊ฐ์ฅ ๋ํ์ ์ธ JWT์ ์ข ๋ฅ
1. ์ก์ธ์ค ํ ํฐ (access token) = ์ ์ ์ด๋ฉ์ผ, ์ฐ๋ฝ์ฒ, ์ฌ์ง ๋ฑ์ ์ ๊ทผํ ์ ์๋ ๊ถํ ๋ถ์ฌ์ ์ฌ์ฉํ๋ค. / ์ ํจ๊ธฐ๊ฐ์ด ์งง๋ค.
2. ๋ฆฌํ๋ ์ ํ ํฐ (refresh token) = ์ก์ธ์ค ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋๋ฉด ๋ฐ๊ธ๋ฐ๋ ํ ํฐ. / ์ ํจ๊ธฐ๊ฐ ๊ธธ๋ค.
ํ ํฐ๊ธฐ๋ฐ ์ธ์ฆ ์ ์ฐจ
1. ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ด๋ / ๋น๋ฐ๋ฒํธ๋ฅผ ๋ด์ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ธ๋ค.
2. ์์ด๋ / ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋์ง ํ์ธํ๊ณ , ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ผ ์ํธํ๋ ํ ํฐ์ ์์ฑํ๋ค. (access/ refresh ํ ํฐ ๋ชจ๋ ์์ฑ)
3. ์๋ฒ๊ฐ ํ ํฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด์ฃผ๋ฉด, ํด๋ผ์ด์ธํธ๋ ํ ํฐ์ ์ ์ฅํ๋ค. (local storage, session storage, cookie ๋ฑ๋ฑ)
4. ํด๋ผ์ด์ธํธ๊ฐ HTTP ํค๋ ๋๋ ์ฟ ํค์ ํ ํฐ์ ๋ด์ ๋ณด๋ธ๋ค. ์ฟ ํค์๋ refresh ํ ํฐ // ํค๋๋ ๋ฐ๋์๋ access ํ ํฐ์ ๋ด๋๋ค.
5. ์๋ฒ๋ ํ ํฐ์ ํด๋ ํด์ ํ ํฐ์ ์ธ์ฆํ๊ณ , ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ ํ ์๋ต์ ๋ณด๋ธ๋ค.
ํ ํฐ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฅ์ ?
1. statelessness & scalability (๋ฌด์ํ์ฑ & ํ์ฅ์ฑ)
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์๋ค.
- ํ ํฐ์ ํค๋์ ์ถ๊ฐํจ์ผ๋ก ์ธ์ฆ์ ์ฐจ ์๋ฃ
2. ์์ ์ฑ
- ์ํธํ ํ ํ ํฐ์ ์ฌ์ฉํ๋ค.
- ์ํธํ ํค๋ฅผ ๋ ธ์ถํ ํ์๊ฐ ์๋ค.
3. ์ด๋์๋ ์์ฑ ๊ฐ๋ฅ
-ํ ํฐ์ ์์ฑํ๋ ์๋ฒ๊ฐ ๊ผญ ํ ํฐ์ ๋ง๋ค์ง ์์๋ ๋๋ค.
4. ๊ถํ ๋ถ์ฌ์ ์ฉ์ด
- ํ ํฐ์ payload(๋ด์ฉ๋ฌผ) ์์ ์ด๋ค ์ ๋ณด์ ์ ๊ทผ ๊ฐ๋ฅํ์ง ์ ์
ex) ์ฌ์ง ๊ถํ๋ง ๋ถ์ฌ / ์ฐ๋ฝ์ฒ ๊ถํ๋ง ๋ถ์ฌ / ์ฌ์ง๊ณผ ์ฐ๋ฝ์ฒ ์ฌ์ฉ๊ถํ ๋ถ์ฌ
OAUTH 2.0
OAUTH๋ ์ธ์ฆ์ ์ค๊ฐํด์ฃผ๋ ๋งค์ปค๋์ฆ์ด๋ค. (์ธ์ฆ์ ์ํ ํ์ค ํ๋กํ ์ฝ์ ํ ์ข ๋ฅ์ด๋ค. )
๋ณด์๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์๊ฒ ๊ถํ์ ์ ๊ณตํ๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๋ ํ๋กํ ์ฝ์ด๋ค.
๐ ์ด๋ฏธ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์น ์๋น์ค(๋ค์ด๋ฒ, ๊นํ, ํ์ด์ค๋ถ, ์นด์นด์คํก ๋ฑ)์์ ์ฌ์ฉ์์ ์ธ์ฆ์ ๋์ ํด์ฃผ๊ณ , ์ ๊ทผ ๊ถํ์ ๋ํ ํ ํฐ์ ๋ฐ๊ธํ ํ ์ด๋ฅผ ์ด์ฉํ์ฌ ์๋ก์ด ์๋ฒ์์ ์ธ์ฆ์ด ๊ฐ๋ฅํด์ง๋ค.
OAUTH ์ฉ์ด ์ ๋ฆฌ
์ฉ์ด | ์ค๋ช |
resource owner | ์ก์ธ์ค ์ค์ธ ๋ฆฌ์์ค์ ์ ์ // ex) hailie |
client | resource owner๋ฅผ ๋์ ํด์ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ๋ ์์ฉํ๋ก๊ทธ๋จ // ex) ์๋ก ๋ค์ด๋ฐ์ app |
resource server | client ์ ์์ฒญ์ ์๋ฝํ๊ณ ์๋ตํ ์ ์๋ ์๋ฒ // ex) ์นด์นด์คํก |
authorization server | resource server๊ฐ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋ ์๋ฒ // ex) ์นด์นด์คํก |
authorization grant | client๊ฐ ์ก์ธ์ค ํ ํฐ์ ์ป์ ๋ ์ฌ์ฉํ๋ ์๊ฒฉ ์ฆ๋ช |
authorization code | ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ ์ ํ์ํ ์ฝ๋ |
access token | ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ๋๋ฐ ์ฌ์ฉ๋๋ credentials |
scope | ์ฃผ์ด์ง ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ก์ธ์คํ ์ ์๋ ๋ฆฌ์์ค ๋ฒ์ // ex) ํ๋กํ |
Grant type์ด๋?
client๊ฐ ์ก์ธ์ค ํ ํฐ์ ์ป๋ ๋ฐฉ๋ฒ
Grant type ์ข ๋ฅ
- Authorization Code Grant Type : ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํจ
์ก์ธ์ค ํ ํฐ์ ๋ฐ์์ค๊ธฐ ์ํด์ ๋จผ์ Authorization Code๋ฅผ ๋ฐ์ ์ก์ธ์ค ํ ํฐ๊ณผ ๊ตํํ๋ ๋ฐฉ๋ฒ
- resource owner๊ฐ client ๋ก ์ ๊ทผ
- client๊ฐ resource owner๋ฅผ authorization server๋ก ๋ฆฌ๋ค์ด๋ ํธ
- resource owner๊ฐ authorization server์๊ฒ ์ก์ธ์ค ๊ถํ ๋ถ์ฌ ์์ฒญ
- authorization server๊ฐ client์๊ฒ authorization code ์ ๊ณต
- client๋ authorization server์๊ฒ authorization code๋ฅผ access token์ผ๋ก ๊ตํ
- client๋ access token์ ํตํด resource server์ ์ก์ธ์ค ๊ฐ๋ฅํด์ง
- client๊ฐ resource server์๊ฒ ์ก์ธ์ค ํ ํฐ๊ณผ ํจ๊ป API ์์ฒญ์ ๋ณด๋
- resource server๋ client๊ฐ ์์ฒญํ resource ์ ๋ฌ
Authorization Code๋ ๋ณด์์ฑ์ ๊ฐํํ๋ค.
client์์ client-secret์ ๊ณต์ ํ๊ณ ์ก์ธ์ค ํ ํฐ์ ๊ฐ์ง๊ณ ์ค๋ ๊ฒ์ ํ์ทจ๋ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ client์์๋ authorization code๋ง ๋ฐ์์ค๊ณ server์์ access token ์์ฒญ์ ์งํํ๋ค.
- Refresh Token Grant Type
์ผ์ ๊ธฐ๊ฐ ์ ํจ ์๊ฐ์ด ์ง๋์ ๋ง๋ฃ๋ ์ก์ธ์ค ํ ํฐ์ ํธ๋ฆฌํ๊ฒ ๋ค์ ๋ฐ์์ค๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
access token๋ณด๋ค refresh token์ ์ ํจ ์๊ฐ์ด ๋์ฒด๋ก ์กฐ๊ธ ๋ ๊ธธ๊ฒ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด๋ค.
(์๋ฒ๋ง๋ค refresh token์ ๋ํ ์ ์ฑ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ refresh token ์ฌ์ฉ์ ์ ์๋ฒ ์ ์ฑ ์์๋ณด๊ธฐ)
- client๊ฐ authorization server์๊ฒ refresh token์ ํตํด์ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ์์ฒญ
- authorization server๋ client์๊ฒ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐํํจ
- client๋ ์ก์ธ์ค ํ ํฐ์ ํตํด resource server์ resource์ ์ก์ธ์ค ๊ฐ๋ฅ
- Implicit Grant Type
- Client Credentials Grant Type
- Resource Owner Credentials Grant Type
์ฐธ๊ณ )
https://defineall.tistory.com/1011
https://yung-developer.tistory.com/112
https://ingg.dev/cors/#cors_solution
https://cinema4dr12.tistory.com/838
https://velog.io/@guswlsapdlf/Session-Cookie-Persistent-Cookie
https://velog.io/@yaytomato/ํ๋ก ํธ์์-์์ ํ๊ฒ-๋ก๊ทธ์ธ-์ฒ๋ฆฌํ๊ธฐ