์๋ฒ๊ฐ ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ์ ์ ์กํ๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ
http ์์ฒญ์ ์์ ํ ๋, ์๋ฒ๋ ์๋ต๊ณผ ํจ๊ป Set-Cookie
ํค๋๋ฅผ ์ ์กํ ์ ์๋ค.
Set-Cookie: <cookie-name>=<cookie-value>
# ์๋ฒ ํค๋
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
# ๋ธ๋ผ์ฐ์
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
Expires
์์ฑ์ ๋ช
์๋ ๋ ์ง์ ์ญ์ ๋๊ฑฐ๋Max-Age
์์ฑ์ ๋ช
์๋๋ ๊ธฐ๊ฐ ์ดํ์ ์ญ์ Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; **HttpOnly**
httpOnly
ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ฒ์ด๋ค.http://
๋ก ์์๋๋ ์ฝ๋๋ฅผ ๋ง๋๋ฉด ์ํธํ๋์ง ์์ ์ํ๋ก ์ฟ ํค๋ฅผ ์๋ฒ๋ก ์ ๋ฌํ๋ค.<img src="http://www.example.com/images/logo.png" />
secure
์ ๋ฏธ์ฌ๋ฅผ ์ฌ์ฉhttps๊ฐ ์๋ ํต์ ์์๋ ์ฟ ํค๋ฅผ ์ ์กํ์ง ์๋๋ค.
Set-Cookie: ์ฟ ํค๋ช
=์ฟ ํค๊ฐ; path=/; **secure**
JWT ํ ํฐ(JSON Web Token)์ header, payload, signature 3๊ฐ์ง๊ฐ .(dot)๋ฅผ ๊ตฌ๋ถ์๋ก ํ์ฌ ์ด๋ฃฌ๋ค.
์ํธํ๋ ์๊ทธ๋์ฒ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ ๋ฐ์ดํฐํจํค์ง(jwt).
https://velog.io/@yaytomato/ํ๋ก ํธ์์-์์ ํ๊ฒ-๋ก๊ทธ์ธ-์ฒ๋ฆฌํ๊ธฐ
accessToken
๊ณผ refreshToken
์ ํด๋ผ์ด์ธํธ์ ์ ์ฅ โ accessToken
์ ๋ก๊ทธ์ธํ ์ ์ ์๊ฒ๋ง ๋ณด์ฌ์ค ์ ์๋ ์ ๋ณด์ ์ ๊ทผํ ๋ ์๋ฒ์ ์ ์ก โ ํ ํฐ์ด ์ ํจํ์ง ํ์ธaccessToken
์ธ๋ฐ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ง๋ฃrefreshToken
์ ์ด์ฉํด ๋ก๊ทธ์ธ์ ์ง์์ ์ผ๋ก ์ ์งaccessToken
์ ๋ฐ๊ธwithCredentials
true
๋ก ์ค์ ํ๋ค. axios.defaults.baseURL = "https://www.abc.com";
axios.defaults.withCredentials = true;
๋ก๊ทธ์ธ api ์์ฒญ
onLogin = (email, password) => {
const data = {
email,
password,
};
axios.post('/login', data).then(response => {
const { accessToken } = response.data;
// API ์์ฒญํ๋ ์ฝ๋ง๋ค ํค๋์ accessToken ๋ด์ ๋ณด๋ด๋๋ก ์ค์
axios.defaults.headers.common['Authorization'] = `Bearer ${accessToken}`;
// accessToken์ localStorage, cookie ๋ฑ์ ์ ์ฅํ์ง ์๋๋ค!
}).catch(error => {
// ... ์๋ฌ ์ฒ๋ฆฌ
});
}
๋ก๊ทธ์ธ ๋ง๋ฃ, ๋ก๊ทธ์ธ ์ฐ์ฅ ์ฒ๋ฆฌ
์ ์ ๊ฐ ๋ชจ๋ฅด๊ฒ ์๋ฒ์์ ์๋ก์ด accessToken์ ๋ฐ์์์ ์กฐ์ฉํ ์๋์ผ๋ก ๋ก๊ทธ์ธ์ด ์ฐ์ฅ๋๋๋ก ํ ์ ์๋ค. (Silent Refresh)
1. ์ผ๋ฐ์ ์ธ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
2. accssToken์ด ๋ง๋ฃ๋์ ๋ ๋ก๊ทธ์ธ ์ฐ์ฅ ์ฒ๋ฆฌ
- 401 error
3. ํ์ด์ง reload ๋ ๋ ๋ก๊ทธ์ธ ์ฐ์ฅ ์ฒ๋ฆฌ
์๋ ํ์ธ์! ์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค:)
๊ถ๊ธํ๊ฒ ์๋๋ฐ์..
axios.defaults.headers.common['Authorization'] =
Bearer ${accessToken}
;์ ํ ํฐ ์ ์ฅํด๋๋ฉด ์๋ก๊ณ ์นจํด๋ ์๋ ๋ผ๊ฐ๋์?