ํ์ฌ ์ ํจํ ์ธ์ฆ ํ ํฐ์ <loginEndpoint>/refresh
์ ๊ฒ์ํ์ฌ ์ ํ ํฐ์ ๋ฐ์ ์ ์์ต๋๋ค. ์๋ก ๊ณ ์นจ ํ ํฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๊ฐ ๋ค๋ฅธ ์ํฌํ๋ก๊ฐ ์์ต๋๋ค.
https://auth0.com/learn/refresh-tokens
:+1: @corymsmith ์ ๋๋ ์ด๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค. "ํด๊ฐ"๋ฅผ ํตํด ๊ฒฐ์น์ ์ ๋์ด ์ด๊ฒ์ ๊ฑท์ด์ฐจ๋๋ก ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ง์คํฐ์์ ์ง์ํ์ง๋ง decoupling
๋ธ๋์น์์๋ ์ง์ํฉ๋๋ค. ํ ํฐ์ ์๋ก ๊ณ ์น๋ ค๋ฉด ๋ ๊ฐ์ง ์ต์
์ด ์์ต๋๋ค.
GET /auth/token/refresh
์ ๋ฌํ ์ ์์ต๋๋ค.ํ ํฐ ๊ฐฑ์ ํ๋ก์ธ์ค๊ฐ ์์ง๋ง ์์ ๊ฒ์ํ Auth0 ๋งํฌ์ ์ค๋ช ๋ ๊ฒ์ฒ๋ผ ์์ ํ ๊ฐฑ์ ํ ํฐ ์ง์์ ์๋๋๋ค. ์ค์ ์๋ก ๊ณ ์นจ ํ ํฐ์ GitHub ์ธ์ฆ ์ฝ๋/๋น๋ฐ๋ฒํธ์ ์ ์ฌํ๊ฒ ์๋ํ์ง๋ง ์ JWT ํ ํฐ์ ์ป๋ ๋ฐ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ JWT ํ ํฐ์ด ๋ง๋ฃ๋๋๋ผ๋ ์๋ก ๊ณ ์นจ ํ ํฐ์ด ์์ผ๋ฉด ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋ก๊ทธ์ธํ ์ ์์ต๋๋ค. userId๊ฐ ๊ทธ๋๋ก ์ ์ง๋๊ณ ์ธ์ ๋ ์ง ์ทจ์๋ ์ ์์ต๋๋ค. ์ ์ด๋ ๊ทธ๊ฒ์ด ๋ด๊ฐ Auth0 ๊ธฐ์ฌ์์ ์์งํ๊ณ ์๋ ๊ฒ์ ๋๋ค.
์ ๋ง๋ค @marshallswain. ๋งํฌ๋ฅผ ํด๋ฆญํ์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค :wink:
๋๋ ์ฒซ ๋ฒ์งธ ์ปท์ ์ํด ์ด๊ฒ์ 1.0 ์ด์ ํ์์ ๋จ๊ฒจ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋๋ค์ด ๋ค์ ์ธ์ฆํ๋ ๊ฒ์ ์ฝ์ต๋๋ค.
์ ๋ ์ด๊ฒ์ feathers-authentication
2.0์ผ๋ก ๋ง๋๋ ๊ฒ์ ํฌํํฉ๋๋ค.
์ข์ ๋ง์.
์ธ์ฆ ์ํฌํ๋ก๊ฐ ์ ํํ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ช ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ํผ๋์ค๋ฝ์ต๋๋ค.
์ง๊ธ ํ๊ณ ์๋ ์ผ์.
1.) ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ์ ์ด๋ฆ ๋ฐ ์ํธ๋ฅผ ๋ณด๋
๋๋ค.
curl -X POST https://xxx/auth/local -H "Content-Type: application/json" -d '{ "email":"xxx", "password":"yyy"}'
์ด๊ฒ์ JWT ํ ํฐ์ ๋ฐํํฉ๋๋ค.
{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NzhhNjUyN2RkMTZiMjIwMDRhY2ZjNmEiLCJpYXQiOjE0NzAzMjYyODUsImV4cCI6MTQ3MDQxMjY4NSwiaXNzIjoiZmVhdGhlcnMifQ.OVvQbnxfoDGxPFm3Y6tBhRae2Qa6_mDq-PVIo8RcC8Y"}
2.) ๊ทธ๋ฐ ๋ค์ ์ด ํ ํฐ์ Authorizatin http ํค๋์ ๋ฃ์ด API์ ์ก์ธ์คํฉ๋๋ค.
curl -X GET https://xxx/users -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NzhhNjUyN2RkMTZiMjIwMDRhY2ZjNmEiLCJpYXQiOjE0NzAzMjU1NzYsImV4cCI6MTQ3MDQxMTk3NiwiaXNzIjoiZmVhdGhlcnMifQ._CHdx3RpEuI189t90mXq-IMPXRNuoVh7nBwY1ON7xCY'
๋ด๊ฐ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ ์ด ํ ํฐ์ ์ค์ ๋ก ์๋ก ๊ณ ์น๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ด๊ฐ ์๋ํ ๊ฒ์ ์ด ํ ํฐ์ xxx/auth/token/refresh๋ก ๋ณด๋ด๋ ๊ฒ์
๋๋ค.
๋ด๊ฐ ์ป์ ๊ฒ์ ๋ ๋ค๋ฅธ ๋งค์ฐ ๊ธด ํ ํฐ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด์ ํ ํฐ๊ณผ ์ ํ ํฐ์ ๋ชจ๋ ์ฌ์ฉํ์ฌ API์ ์ก์ธ์คํ๋ ค๊ณ ํ์ต๋๋ค. ๋ ๋ค ์๋ํฉ๋๋ค ... (์ด์ ๊ฒ์ ๋นํ์ฑํํด์ผํ์ง ์์ต๋๊น?)
curl -X GET https://xxx/auth/token/refresh -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NzhhNjUyN2RkMTZiMjIwMDRhY2ZjNmEiLCJpYXQiOjE0NzAzMjU1NzYsImV4cCI6MTQ3MDQxMTk3NiwiaXNzIjoiZmVhdGhlcnMifQ._CHdx3RpEuI189t90mXq-IMPXRNuoVh7nBwY1ON7xCY'
{"query":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NzhhNjUyN2RkMTZiMjIwMDRhY2ZjNmEiLCJpYXQiOjE0NzAzMjU1NzYsImV4cCI6MTQ3MDQxMTk3NiwiaXNzIjoiZmVhdGhlcnMifQ._CHdx3RpEuI189t90mXq-IMPXRNuoVh7nBwY1ON7xCY"},"provider":"rest","token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxdWVyeSI6eyJ0b2tlbiI6ImV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVekkxTmlKOS5leUpmYVdRaU9pSTFOemhoTmpVeU4yUmtNVFppTWpJd01EUmhZMlpqTm1FaUxDSnBZWFFpT2pFME56QXpNalUxTnpZc0ltVjRjQ0k2TVRRM01EUXhNVGszTml3aWFYTnpJam9pWm1WaGRHaGxjbk1pZlEuX0NIZHgzUnBFdUkxODl0OTBtWHEtSU1QWFJOdW9WaDduQndZMU9ON3hDWSJ9LCJwcm92aWRlciI6InJlc3QiLCJ0b2tlbiI6ImV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVekkxTmlKOS5leUpmYVdRaU9pSTFOemhoTmpVeU4yUmtNVFppTWpJd01EUmhZMlpqTm1FaUxDSnBZWFFpT2pFME56QXpNalUxTnpZc0ltVjRjQ0k2TVRRM01EUXhNVGszTml3aWFYTnpJam9pWm1WaGRHaGxjbk1pZlEuX0NIZHgzUnBFdUkxODl0OTBtWHEtSU1QWFJOdW9WaDduQndZMU9ON3hDWSIsImRhdGEiOnsiX2lkIjoiNTc4YTY1MjdkZDE2YjIyMDA0YWNmYzZhIiwiaWF0IjoxNDcwMzI1NTc2LCJleHAiOjE0NzA0MTE5NzYsImlzcyI6ImZlYXRoZXJzIiwidG9rZW4iOiJleUowZVhBaU9pSktWMVFpTENKaGJHY2lPaUpJVXpJMU5pSjkuZXlKZmFXUWlPaUkxTnpoaE5qVXlOMlJrTVRaaU1qSXdNRFJoWTJaak5tRWlMQ0pwWVhRaU9qRTBOekF6TWpVMU56WXNJbVY0Y0NJNk1UUTNNRFF4TVRrM05pd2lhWE56SWpvaVptVmhkR2hsY25NaWZRLl9DSGR4M1JwRXVJMTg5dDkwbVhxLUlNUFhSTnVvVmg3bkJ3WTFPTjd4Q1kifSwiaWF0IjoxNDcwMzI2NDQyLCJleHAiOjE0NzA0MTI4NDIsImlzcyI6ImZlYXRoZXJzIn0.TqUv3051TTGbX4cPfkN-6pOOB5SN9nH-E7TU1HHSsb8","data":{"_id":"578a6527dd16b22004acfc6a","iat":1470325576,"exp":1470411976,"iss":"feathers","token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NzhhNjUyN2RkMTZiMjIwMDRhY2ZjNmEiLCJpYXQiOjE0NzAzMjU1NzYsImV4cCI6MTQ3MDQxMTk3NiwiaXNzIjoiZmVhdGhlcnMifQ._CHdx3RpEuI189t90mXq-IMPXRNuoVh7nBwY1ON7xCY"}}
๋ ์ด์ํ ์ ์ ์ด ์ ํ ํฐ์ ์ฌ์ฉํ์ฌ /auth/token/refresh๋ก ๋ค์ ๋ณด๋ด๋ ค๊ณ ํ์ต๋๋ค.
๋๋ ์ด๊ฒ๋ณด๋ค ๋ ๊ธด ํ ํฐ์ ์ป์๋ค.
์ฌ๊ธฐ์ ๋ด๊ฐ ๋ฌด์์ ์๋ชปํ๊ฑฐ๋ ์คํดํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ์ํ์ญ์์ค.
@parnurzeal ์ฐ๋ฆฌ๋ ์์ง ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ง์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ ์๋ ๊ธฐ๋ฅ์ธ ์ด์ ์ ๋๋ค.
์ ํ ํฐ์ ์ป๋ ๋ฐฉ๋ฒ์ ๊ธฐ์กด์ ์ ํจํ JWT๋ก /auth/token
๋ํ POST๋ฅผ ์ํํ๊ฑฐ๋ ๋ค๋ฅธ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ๋ ๊ฒ์
๋๋ค. ๋น์ ์ ๋ชจ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ ๊ธด ํ๋ฐ ์ ๊ฐ ์ด๋ป๊ฒ ํ๋์ง, ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ์ป์๋์ง ์ ๋ด์ฃผ์ธ์.
์ฌ์ด ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
abcdefghijklmno
์ฌ์ฉํ์ฌ ์ ํ ํฐ์ ์์ฒญํ ๋(๋จ์ง ์์์ ๋ง๋ ์๋๋ ํ ํฐ).
์๋ต ๋ฐฑ์ ์ด์ ํ ํฐ์ ๋ ๊ธด ๋ฒ์ ์ผ ๋ฟ์
๋๋ค. -> abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
์ฌ์ฉํ์ฌ ๋ค์ ์๋ํ๋ฉด ๋ ๊ธด ๋ฒ์ ์ ์ป๊ฒ ๋ฉ๋๋ค ->
abcdefghijklmnopqrstuvwxyz1234567890
๋ฐ ๋ฃจํ๊ฐ ๊ณ์๋ฉ๋๋ค(๋ ๋ง์ด ์์ฒญํ๋ฉด ์ด์ ๋ฒ์ ์ ๋ ๊ธด ๋ฒ์ ์ ์ป์).
๋ํ ์์ ์ธ ๊ฐ์ง ํ ํฐ์ ๋ชจ๋ ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ํ ํฐ์ ์์ฒญํ ํ ์ด์ ํ ํฐ์ด ๋ง๋ฃ๋์ด์ผ ํ์ง ์์ต๋๊น?
@parnurzeal ๋ด ๋ง์ ๊ทธ ๊ธฐ๋ฅ์ด ์ค์ ๋ก ๊ตฌํ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋น์ ์ด ํ ์ผ์ ํ์ง ๋ง๋ผ๋ ๊ฒ์
๋๋ค. ๊ตฌํ(์ง๊ธ๊น์ง)์ ๋ฐ๋ฅด๋ฉด /auth/token/refresh
๋๋ฌํ ๋๋ง๋ค ํ ํฐ์ด ๊ณ์ ์ฆ๊ฐํ๋ค๋ ์ฌ์ค์ ๋ฐ์ดํฐ๋ฅผ ํ ํฐ์ ๋ค์ ๋ฐ์ด๋ฃ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๊ฒ์ ์๋ํ๋๋ก ์๋๋ ๋ฐฉ์์ด ์๋๋ฉฐ ์๋ฃํ ์๊ฐ์ด ์์์ผ๋ฉฐ ์ด๊ฒ์ด ๋ฌธ์ํ๋์ง ์์ ์ด์ ์
๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ์ฌ์ฉํด์๋ ์๋ฉ๋๋ค.
์ ํ ํฐ์ ์์ฒญํ ํ ์ด์ ํ ํฐ์ด ๋ง๋ฃ๋์ด์ผ ํ์ง ์์ต๋๊น?
์ด๊ฒ์ด JWT์ ํน์ฑ์ ๋๋ค. TTL์์ ์์ฒด์ ์ผ๋ก ๋ง๋ฃ๋ฉ๋๋ค. ์์ง ๋ง๋ฃ๋์ง ์์ ์ค๋๋ ํ ํฐ์ด ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด ๋ธ๋๋ฆฌ์คํธ๋ฅผ ์ ์งํด์ผ ํฉ๋๋ค. ํ์ฌ ์ด๊ฒ์ ์ฌ๋ฌ๋ถ์๊ฒ ๋ฌ๋ ค ์์ผ๋ฉฐ ์ด์ ๋ํ ๋ฏธํด๊ฒฐ ๋ฌธ์ (#133)๊ฐ ์์ง๋ง ๊ณง (๋ง์ฝ ์๋ค๋ฉด) ํด๊ฒฐ๋์ง ์์ ๊ฒ์ ๋๋ค.
์๋ ํ์ธ์, ์ ๋ /auth/refresh/token์ ์กฐ์ฌํ๊ณ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
...
function pick (o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
// Provider specific config
const defaults = {
payload: ['id', 'role'],
passwordField: 'password',
issuer: 'feathers',
algorithm: 'HS256',
expiresIn: '1d', // 1 day
};
...
// GET /auth/token/refresh
get (id, params) {
if (id !== 'refresh') {
return Promise.reject(new errors.NotFound());
}
const options = this.options;
// Add payload fields
const data = pick(params.payload, options.payload);
return new Promise(resolve => {
jwt.sign(data, config.get('auth').token.secret, options, token => {
return resolve({token: token});
});
});
}
๊ตฌํ์ด ๋๋ฌด ์์งํ๊ฐ์? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ฐ๋ง๋ฅผ ์๋ํ๊ณ ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ณ PR์ ๋ง๋ค ์ ์์ต๋๋ค.
@aboutlo ๋
ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! v0.8์ด ์ถ์๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค(์ง๊ธ์ ์ํ ์ํ์). ๋ง์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ณ ์ด๋ฒ ์ฃผ์ ํด๋น ๊ฒฝ๋ก๊ฐ ์ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ ๋ ์ค๋ ๋ฒ ํ ๋ฆด๋ฆฌ์ค๋ฅผ ์ค๋จํ๊ณ ํ์ฌ ๋ง์ด๊ทธ๋ ์ด์
๊ฐ์ด๋๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธธ์ง ์์ ๊ฒ์ด๋ฉฐ v0.8์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ๋ง์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ฐ๋ฆฌ๋ ํ ํฐ์ ์๋ก ๊ณ ์นจํ๊ธฐ ์ํด ๋ง์ ์๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ 0.8์ด ์ถ์๋๋ฉด(์ด๋ฒ ์ฃผ) ์ด ๋ฌธ์ ์ ๋ํด ๋ ผ์ํ๊ณ ์ถ์ต๋๋ค. ์ด๋ฒ ์ฃผ ํ๋ฐ์ ์๋น์ ์ธ ์๊ฐ์ ํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ถฉ๋ถํ ๊ณต์ ํ @ekryski , ๋๋ 0.8์ ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค :)
์ด ๊ธฐ๋ฅ์ React Native ์ฑ๊ณผ ๊ด๋ จํ์ฌ MUST์ ๋๋ค. ์ฌ์ฉ์๋ ์ฒ์์ ๋ก๊ทธ์ธํ๊ณ ๋ช ์ฃผ ํ์ ์ฑ์ ์ด๋ฉด ์ฌ์ ํ ๋ก๊ทธ์ธ๋์ด ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
@deiucanta ์ข์ ์์์ [email protected] ์ ์ค๊ณํ๋ ๋์ ์ด ๊ธฐ๋ฅ์ ์ผ๋์
์ข์ ์์์ ๋๋ค! ๐ ๊ธฐ๋๋ฉ๋๋ค
@marshallswain ์ด ๊ธฐ๋ฅ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ธ์ ์์๋๋์ง ์๋ ค์ฃผ์ธ์. ์๋๋ฉด ์ด๋ฏธ ์ถ์๋๊ฑด๊ฐ์? ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@deiucanta ๊ทธ๋์ ์ด ๊ธฐ๋ฅ์ด ์ถ์๋ ๋๊น์ง ์๋ช ์ด ๋ ๊ธด ํ ํฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด์ ๋๋ฉด ์ธ์ฆ ์ํธ๋ฅผ ์ ๊ฐ์ผ๋ก ๊ต์ฒดํ์ฌ ๊ธฐ์กด ์ธ์ ์ ๋ชจ๋ ์ง์ฐ๊ณ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ ์งง์ ๊ฐฑ์ ์ธ์ ์ ์ฌ์ฉํ๋๋ก ํ ์ ์์ต๋๋ค.
@atulrpandey ์ ์ ์ถ์๋ ์๋์ง๋ง ๊ตฌํํ๊ธฐ๋ ์ด๋ ต์ง ์์ต๋๋ค. ์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์์ฑํ๊ณ DB์ ์ฌ์ฉ์ ๊ฐ์ฒด์ ์ ์ฅํ๋ ํํฌ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ์ฌ์ฉ๋๊ฑฐ๋ ๋ง๋ฃ๋๋ฉด ์ฌ์ฉ์์๊ฒ์ ์ ๊ฑฐํฉ๋๋ค.
@pettermikitsh ๋น์ ์ด ํ ์์๋ ๋ ๋ค๋ฅธ ์ผ์ (๋ชจ๋ฐ์ผ์์๋ ๊ฒฝ์ฐ) clientId
๋ฐ clientSecret
ํด๋ผ์ด์ธํธ์ ์์ ํ๊ฒ ์ ์ฅํ๊ณ JWT accessToken์ด ๋ง๋ฃ๋๋ฉด ๋ค์ ์ธ์ฆํ์ญ์์ค.
@ekryski ์ด๋ฌํ ์ ๋ต ์ค ํ๋์ ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ์ ๋ง ๋์์ด ๋ ๊ฒ์
๋๋ค.
์๋๋ฉด ๊ณต์ ์ง์์ด ํ๋ฆฌ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋์? ์ด๊ฒ์ ๋ชจ๋ฐ์ผ ์ธ์ฆ์ ์ ๋ง ๋์์ด ๋ ๊ฒ์
๋๋ค!
์๋ก ๊ณ ์นจ ํ ํฐ ์ฃผ์ :
์๋ก ๊ณ ์นจ ํ ํฐ์ ์ ์ก์ธ์ค ํ ํฐ์ ์ป๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ฆ, ํน์ ๋ฆฌ์์ค์ ์ก์ธ์คํ๊ธฐ ์ํด ์ก์ธ์ค ํ ํฐ์ด ํ์ํ ๋๋ง๋ค ํด๋ผ์ด์ธํธ๋ ์ธ์ฆ ์๋ฒ์์ ๋ฐ๊ธํ ์ ์ก์ธ์ค ํ ํฐ์ ์ป๊ธฐ ์ํด ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์๋ ์ด์ ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋ ํ ์ ์ก์ธ์ค ํ ํฐ์ ์ป๊ฑฐ๋ ์ ๋ฆฌ์์ค์ ์ฒ์์ผ๋ก ์ก์ธ์คํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ์๋ก ๊ณ ์นจ ํ ํฐ๋ ๋ง๋ฃ๋ ์ ์์ง๋ง ์คํ๋ ค ์ค๋ ์ง์๋ฉ๋๋ค. ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ถ๋์ง ์๋๋ก ์๊ฒฉํ ์ ์ฅ ์๊ตฌ ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค. ์ธ์ฆ ์๋ฒ์์ ๋ธ๋๋ฆฌ์คํธ ์ https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/
๊ทธ๋์ ์๊ฐ๋ณด๋ค ๋นจ๋ฆฌ React Native์ ์ ๋ฌธํ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๊ธฐ์ฌํ ์ ์์์ง ์๊ฐํ๊ณ ์์ง๋ง ๊ทธ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๊ตฌํ์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ฉ์ปค๋์ฆ์ ์์ ํ ์ดํดํ๊ณ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค. ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ํ ๋น์ ์ฅ์ด ์๋๋ฏ๋ก ์ฌ์ฉ์ ๋ช ๊ฐ์ง ์ ์ฝ์ด ์์ต๋๋ค(์: ๊ฐ๋ฐ์๊ฐ ์ ์ฅ์ ์ด๋ํฐ๋ฅผ ์ ๊ณตํด์ผ ํจ).
์ ํจํ JWT๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ป์ ์ ์์ต๋๊น? ์๋๋ฉด ์ธ์ฆ ์๋ต์์ ์๋ก ๊ณ ์นจ ํ ํฐ์ด ์๋์ผ๋ก ๋ฐํ๋ฉ๋๊น(์: accessToken
)? Auth0์ด https://auth0.com/learn/refresh-tokens/ ์ ์์์ ์ธ์ฆ ์๋ต( accessToken
๋ฐ refreshToken
)์ ์ด๋ฅผ ํฌํจํ๋ ๊ฒ ๊ฐ์ต๋๋ค .
@pettermikitsh ์ ํจํ JWT๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ป์ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋๊ตฌ๋ JWT๋ฅผ ์ป์ ์ ์๊ณ ๊ณ์ ์ ๊ณ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
์๋ก ๊ณ ์นจ ํ ํฐ์ ์ผ๋ฐ์ ์ผ๋ก ๋ก๊ทธ์ธ/๊ฐ์ ์๋ต๊ณผ ํจ๊ป ๋ฐํ๋๋ฉฐ ํด๋ผ์ด์ธํธ๋ ๋ค์ ๋ก๊ทธ์ธ/๊ฐ์ ํ์ฌ ์ ์ธ์ ๊ณผ ์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ ๊ณตํ์ง ์๋ ํ ํน์ ์ธ์ ์ ๋ํด ๋ค์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
์๋ก ๊ณ ์นจ ํ ํฐ์ ์ค์ ๋ก ๋ง๋ฃ๋ ํ์๊ฐ ์์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ ๊ฒฝ์ฐ ํธ์ถ๋ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ผ๋ง๋ ๋ง์ ํ์ฑ ์ธ์ ์ด ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์๋ก ๊ณ ์นจ ํ ํฐ์ ๋ฐํํ ๋ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค(์: os, ip, ์ฅ์น ์ด๋ฆ ๋ฑ).
์ ์ด๋ ์ ๋ ๊ทธ๋ ๊ฒ ํฉ๋๋ค.
์๋ก ๊ณ ์นจ ํ ํฐ์ ๋ฐ๊ธํ ๋์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์ธ์ฆ์ ํ์ธํ๋ ํ ์ ํจํ JWT๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ๊ณ ์นจ ํ ํฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ข์ต๋๋ค.
@marshallswain
ํ์ฌ ์ ํจํ ์ธ์ฆ ํ ํฐ์
<loginEndpoint>/refresh
์ ๊ฒ์ํ์ฌ ์ ํ ํฐ์ ๋ฐ์ ์ ์์ต๋๋ค. ์๋ก ๊ณ ์นจ ํ ํฐ์๋ ์ฝ๊ฐ ๋ค๋ฅธ ์ํฌํ๋ก๊ฐ ์์ต๋๋ค...
๋ฐ๋ผ์ ํผ๋์ ํผํ๊ธฐ ์ํด refresh
๊ฐ ์๋ renew
๋ถ๋ฌ์ผ ํฉ๋๋ค. <loginEndpoint>/renew
@abhishekbhardwaj๊ฐ ๋งํ๋ฏ์ด
accessToken์ accessToken์ผ๋ก ์๋ก ๊ณ ์น ์ ์๊ณ refresehToken ๋๋ ์ฌ์ฉ์ ์ด๋ฆ/๋น๋ฐ๋ฒํธ๋ก๋ง ์๋ก ๊ณ ์น ์ ์์ด์ผ ํฉ๋๋ค. ์ธ์ฆ...
ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด accessToken์ ์ฌ์ฉํ์ฌ accessToken์ ์๋ก ๊ณ ์น ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ accessToken์ ํ์ด๋ก๋ ๋ด๋ถ์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ ์ฅํ ๋ค์ ํ์ฌ ์๋ก ๊ณ ์นจ API๊ฐ ์๋ก ๊ณ ์นจ ํ ํฐ์ด ์ทจ์๋์ง ์์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค(๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ redis ํธ์ถ์ ํตํด). ์ด ๋ฐฉ๋ฒ์ผ๋ก ์๋ก ๊ณ ์นจ ํ ํฐ์ ๊ฐ๋จํ ์๋ ์ฆ๊ฐ ID๊ฐ ๋ ์ ์์ต๋๋ค. ๋ํ ์๋ก ๊ณ ์นจ API๋ ๋ ์ด์ ๋ง๋ฃ๋ฅผ ํ์ธํ์ง ์์์ผ ํฉ๋๋ค. ๊ฐฑ์ ํ ํฐ(๋จ์ ์ ์)์ ์ก์ธ์ค ํ ํฐ์ผ๋ก ์๋ช ๋์ด ์์ผ๋ฏ๋ก ์์ ํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ํ์ฌ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ํ ๋ณ๊ฒฝ์ ์ต์ํํด์ผ ํฉ๋๋ค. ์๋ก ๊ณ ์นจ API์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ก์ธ์ค ํ ํฐ์ด ์ทจ์๋์ง ์์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค(ํ์ด๋ก๋ ๋ด๋ถ์ ์๋ก ๊ณ ์นจ ํ ํฐ ํ์ธ์ ํตํด). ์ด ํํฌ๊ฐ ์ ๊ณต๋๋ฉด t ๋ ์ด์ ๋ง๋ฃ ์๊ฐ์ ํ์ธํฉ๋๋ค.
@arash16์์ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ข ๋ ์ค๋ช ํด
accessTokens ํ์ด๋ก๋์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ ์ฅํ๊ณ ์๋ก ๊ณ ์นจ API๊ฐ ๋ง๋ฃ๋ฅผ ํ์ธํ์ง ์์ผ๋ฉด ๋ชจ๋ accessToken์ "๋น๋ง๊ธฐ"๋ก ํจ๊ณผ์ ์ผ๋ก ๋ง๋ค์ง ์์์ต๋๊น?
๋ชจ๋ accessToken์ ์ฌ์ฉํ์ฌ ์ ์ก์ธ์ค ํ ํฐ์ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ต๋๊น?
๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ต๋๊น?
@BigAB
๋๋ refresh api ์ ๋ํด์๋ง ๋ง๋ฃ๋ฅผ ํ์ธํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค. ๋์ผํ accessToken์ด refresh-token๊ณผ access-token์ผ๋ก ๋ชจ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํ ํฐ์ ์๋ก๊ณ ์นจํ๊ณ ์ ์ก์ธ์ค ํ ํฐ์ ์ป๋ ๊ฒฝ์ฐ์๋ง ๋ง๋ฃ๋์ง ์์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก refresh-id ์์ฒด๋ฅผ
๊ฐ๋ฐ์๋ ๋ชจ๋ ์๋ก ๊ณ ์นจ ID๋ฅผ ์ ์ฅํ db-table/redis๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ผ๋ถ(๋๋ ๋ชจ๋ ) ๋ค๋ฅธ ์ธ์ ์์ ์ทจ์ํ๊ฑฐ๋ ๋ก๊ทธ์์ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์๋ก ๊ณ ์นจ ID ๋ชฉ๋ก(๋ธ๋ผ์ฐ์ ๋๋ ์์ฑ ๋ ์ง ๋ฑ๊ณผ ๊ฐ์ ๊ธฐํ ์ถ๊ฐ ์ ๋ณด ํฌํจ)์ ์ ๊ณตํ ์ ์์ผ๋ฉฐ ์ฌ์ฉ์๋ ์ ๊ฑฐ(์๋ช - ๋ฐ์ผ๋ก) ์ ํ์ ์ผ๋ก. ๊ทธ๋ฐ ๋ค์ ํด๋น ์๋ก ๊ณ ์นจ ID๋ฅผ ํฌํจํ๋ ์ค์ ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ์๋ก ๊ณ ์นจ API๊ฐ ์ ํ ํฐ ์ ๊ณต์ ๊ฑฐ๋ถํฉ๋๋ค.
ํ ํฐ ๋ด๋ถ์ refresh-id๋ ๋๋ถ๋ถ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ํ ํฐ์ด ๋ง๋ฃ๋ ๋๊น์ง ๊ถํ ๋ถ์ฌ๊ฐ ์ํ ๋น์ ์ฅ์ ๋๋ค.
์ก์ธ์ค ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ์งง์ ์ ์์ผ๋ฉฐ(10๋ถ ๋ฏธ๋ง) ์ฌ์ฉ์๋ ํ์ด์ง๋ฅผ ๋ซ๊ณ ์๋ฆฌ๋ฅผ ๋ฐ ์ ์์ผ๋ฉฐ ๋์ค์ ํ์ด์ง๋ฅผ ์ด๋ฉด ์ก์ธ์ค ํ ํฐ์ด ์ด๋ฏธ ๋ง๋ฃ๋์ด ๋ก๊ทธ์์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ํ ํฐ ๋ด๋ถ์ refresh-id๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๋ฆฌํ๋ ์๋ช ์ด ํจ์ฌ
๋ณด์ ๊ด์ ์์ ์ด ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ ์ก์ธ์ค ํ ํฐ์ ์ด์ ์ธ์ ํค์ฒ๋ผ ์ทจ๊ธ๋์ด์ผ ํ๋ฉฐ, ๋งค๋ฒ(๋ง๋ฃ๋ ํ ๋ฒ๋ง) ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํธ์ถํ ํ์๊ฐ ์๋ค๋ ์ถ๊ฐ ์ด์ ์ด ์์ต๋๋ค.
@ arash16 , ์ก์ธ์ค JWT ๋ด๋ถ์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ ์ฅํ๋ ์์ด๋์ด๊ฐ ์ข์ต๋๋ค. ์๋ฒ ์ธก์์ ์ด ์๋ก ๊ณ ์นจ ํ ํฐ์ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๊ฐ ์์ต๋๊น?
๋ด ํ์ฌ ๋ฌธ์ : ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ํ๋์ ํํฌ ์ปจํ
์คํธ์์ ํ์ด๋ก๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. @feathersjs/authentication
ํจํค์ง์ verifyJWT()
์ ํธ๋ฆฌํฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด app.service('authentication').hooks({ before: { create: ... } })
์ ๋งจ ์ฒ์์ ?
์ง๊ธ ๊นํธ์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ฌ์ฉํ๋ ์ฃผ์๊น์ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๊ทธ๋ค์ ๋ํ ์ง์์ ์ถ๊ฐํ ๊ณํ์ด ์์ต๋๊น?
๋ชจ๋๋ค ์๋ ,
์์ง ์ฌ์ฉํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค(๋๋ ๋ด๊ฐ ๋์น๊ณ ์๋ ๊ฒ์ด ์์ต๋๊น). ์ธ์ ์ฌ์ฉํ ์ ์๋์ง ์๋ ค์ฃผ์๊ฒ ์ต๋๊น? ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ๊ถ ๊ฐฑ์ ํ ํฐ ์ ์ฅ์๊ฐ ์์ต๋๋ค. ์๋ฌด๋ ์ด๊ฒ์ ์๋ ํ์ต๋๊น?
https://github.com/fiznool/passport-oauth2-refresh
์๋
ํ์ธ์ @daffl๋
Google ์ ๋ต์ ์ํด ํ ํฐ์ ์๋ก ๊ณ ์น ์ ์๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ ์ค ์ ์๋ ์ฌ๋์ด ์์ต๋๊น? Google ๋ก๊ทธ์ธ ์๋๋ฆฌ์ค์ ๋ํ ๋น๋ฐ๋ฒํธ๊ฐ ์๊ธฐ ๋๋ฌธ์?
๊ฐ์ฌ ํด์
๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ accessToken์ ํ์ด๋ก๋ ๋ด๋ถ์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ ์ฅํ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ๋ง๋ฃ๋ ์ก์ธ์ค ํ ํฐ ์ค ํ๋ ๋ผ๋ ๊ฐ์ง๊ณ ์๋ ์ฌ๋์ ๋๊ตฌ๋ ์ฝ๊ฒ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋์์ด ์์ฑํ ์ ์์ต๋๋ค. ์๋๋ฉด ์ ๊ฐ ๋์น ๊ฒ์ด ์์ต๋๊น?
์๋ก ๊ณ ์นจ ํ ํฐ์ ํด๋ผ์ด์ธํธ์ ์์ ํ๊ฒ ์ ์ฅ๋์ด์ผ ํ๋ฉฐ ์ด ํด๋ผ์ด์ธํธ๋ฅผ ์ ์ธํ ๋๊ตฌ๋ ํ ํฐ์ ์ก์ธ์คํ ์ ์์ด์ผ ํฉ๋๋ค!
@deiucanta ์ข์ ์์์ [email protected] ์ ์ค๊ณํ๋ ๋์ ์ด ๊ธฐ๋ฅ์ ์ผ๋์
์ด๊ฒ์ 2016๋ ์ ๊ฒ์๋์์ต๋๋ค. ์ฌ๋ฌ๋ถ, ์ด ํ์ ๊ธฐ๋ฅ์ ์์ง ์ง์ํ ๊ณํ์ด ์์ต๋๊น?
์๋์. ๋ง๋ฃ๋ ํ ํฐ์ผ๋ก๋ ์๋ฌด ๊ฒ๋ ํ ์ ์์ต๋๋ค. ๋ํ ๊ฐฑ์ ํ ํฐ์ v4 ์ํํ ์์ ํจ์ฌ ๋ ์ฝ๊ฒ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๋ฆฌ์ฑ ํญ๋ชฉ์ ์ต์ข ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ ๋๋ค.
๋ํ ๊ฐฑ์ ํ ํฐ์ v4 ์ํํ ์์ ํจ์ฌ ๋ ์ฝ๊ฒ ๊ฐ๋ฅํฉ๋๋ค.
๋๋ต์ ์ธ ์ถ์์ผ์ด ์์ต๋๊น?
๊ทธ๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๋ฆฌ์ฑ ํญ๋ชฉ์ ์ต์ข ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ ๋๋ค.
์ด ๊ฐ์ด๋๊ฐ ์ถ์๋ ๋๊น์ง v4 ํ๋ฆฌ๋ฆด๋ฆฌ์ฆ์์ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ช ๋ง๋๋ก ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@๋ํํ
์์ง ๊ณต์์ ์ธ ๋ฐฉ๋ฒ์ด ์๋์? v4๊ฐ ์ฌ๊ธฐ์ ์์ผ๋ฉฐ ๋ฌธ์์ ์๋ฌด ๊ฒ๋ ํ์๋์ง ์์ต๋๋ค.
@daffl ์ธ์ฆ ์๋น์ค์ ๋ํ ํดํน ์์ด 4.0์์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๋ฌ์ฑ๋ ์ ์๋์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@MichaelErmer ๋ฅผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๋ก์ปฌ ๋๋ ์ฌ์ฉ์ ์ ์ ์ ๋ต์ ์ฌ์ฉํ์ฌ jwt๋ฅผ ๊ฐฑ์ ํ ์ ์์ง๋ง ์ด์์ ์ด์ง๋ ์์ง๋ง ๋ด๋ถ ํต์ ์๋ ์ ์๋ํฉ๋๋ค.
function initAuth() {
return async (ctx) => {
if (ctx.path !== 'authentication') {
const [authenticated, accessToken] = await Promise.all([
ctx.app.get('authentication'),
ctx.app.authentication.getAccessToken(),
]);
if (!accessToken || !authenticated) {
const result = await ctx.app.authenticate(apiLocalCreds);
ctx.params = {
...ctx.params,
...result,
headers: { ...(ctx.params.headers || {}), Authorization: result.accessToken },
};
} else {
const { exp } = decode(accessToken);
const expired = Date.now() / 1000 > exp - 60 * 60;
if (expired) {
const result = await ctx.app.authenticate(apiLocalCreds);
ctx.params = {
...ctx.params,
...result,
headers: { ...(ctx.params.headers || {}), Authorization: result.accessToken },
};
}
}
}
return ctx;
};
}
client
.configure(rest(apiHost).superagent(superagent))
.configure(auth(authConfig))
.hooks({ before: [initAuth()] });
ํ์ฌ ์ ๋ v4 authentication
์์ ์ด after
ํํฌ๋ฅผ ์ฌ์ฉํ์ฌ 20์ผ ํ์ ๋ด accessToken์ ์
๋ฐ์ดํธํ๊ณ ์์ต๋๋ค...
````์๋ฐ์คํฌ๋ฆฝํธ
const {๋ ์ง ์๊ฐ} = ์๊ตฌ('luxon')
const ๊ฐฑ์ ํ = {์ผ: 20}
module.exports = () => {
๋น๋๊ธฐ ์ปจํ
์คํธ ๋ฐํ => {
๋ง์ฝ (
context.method === '๋ง๋ค๊ธฐ' &&
context.type === '๋ค์' &&
context.path === '์ธ์ฆ' &&
context.data && context.data.strategy === 'jwt' &&
context.result &&
context.result.accessToken) {
// ํ ํฐ ๊ฐฑ์ ์ด ํ์ํ์ง ํ์ธ
const ํ์ด๋ก๋ = context.app.service('์ธ์ฆ').verifyAccessToken(context.result.accessToken)์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
const ๋ฐํ ์๊ฐ = DateTime.fromMillis(payload.iat * 1000)
const ๊ฐฑ์ ํ = ๋ฐํ๋At.plus(๊ฐฑ์ ํ)
์ง๊ธ const = DateTime.local()
if (์ง๊ธ > ๊ฐฑ์ ํ) {
context.result.accessToken = ๋๊ธฐ context.app.service('์ธ์ฆ').createAccessToken({sub: payload.sub})
}
}
์ปจํ
์คํธ ๋ฐํ
}
}
````
์ด ํํฌ๋ฅผ after
๋ฐ ๋ง์ง๋ง ํํฌ๋ก ๋์ด ๋ชจ๋ ํ์ธ ๋ฑ์ด ํต๊ณผ๋๋๋ก ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๊นํธ์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ํตํฉํ ๊ณํ์ด ์์ต๋๊น?
๋๋ ๊ทธ ์ง๋ฌธ์ ํ ๋ฉ์์ง ๋ ์ผ์ฐ ๋ ๋ฒ์งธ๋ก ํ๋ค.
์๋ก ๊ณ ์นจ ํ ํฐ ์ํฌํ๋ก์ ๋ํด์๋ ๊ถ๊ธํฉ๋๋ค. @m0dch3n ์ด ์์ฑํ ์๋ฃจ์ ์ด ์ข์ ๋ฐฉ๋ฒ์ ๋๊น? ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํด์ผ ํฉ๋๊น?
๋ด ์๊ฒฌ์ ์ ์ฒด refreshToken ์ํฌํ๋ก๋ ์ค๊ฐ ๊ณต๊ฒฉ์์ ๋ํด ์ฝ๊ฐ๋ง ๋ณดํธํ๋ฏ๋ก ์ค๊ฐ ์ฌ๋์ด accessToken์ ํ์น๋ค๋ฉด ์ต์ํ ์๋ก ๊ณ ์นจํ ์ ์๊ณ ๋ฆฌ์์ค์ ๋ฌดํํ ์ก์ธ์ค ๊ถํ์ ๊ฐ์ง ์ ์์ต๋๋ค.
XSS๋ก๋ถํฐ ๋ณดํธํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ณต๊ฒฉ์๊ฐ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅ๋ ๋ชจ๋ ๊ฒ์ ํ์น ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฆฌํ๋ ์ํ ํฐ๋ ๊ทธ๋ ๊ณ ...
์ด์ ๋ฌธ์ ๋ accessToken ๋ง๋ฃ ์๊ฐ์ ๋๋ฌด ์งง๊ฒ(์ฆ, 5๋ถ) ๋ง๋ค๋ฉด ๋๋ฌด ์์ฃผ ์๋ก ๊ณ ์นจ์ ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ค๊ฐ์ ์๋ ๋จ์๋ refreshToken์ ๊ฐ๋ก์ฑ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ ์์ฒญ์ 5๋ถ ๋์๋ง ๋ค์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด... ๋ง๋ฃ๋ฅผ ๋ ๊ธธ๊ฒ ๋ง๋ค๋ฉด accessToken๋ง์ผ๋ก๋ ๋ ์ค๋ ์ก์ธ์คํ ์ ์์ต๋๋ค...
์์งํ ์ผ๋ถ ํด๋ผ์ด์ธํธ๊ฐ ์ก์ธ์ค ๊ถํ์ ๋๋๋นํ๋ค๊ณ ๋งํ๋ฉด accessToken ๊ณผ refreshToken์ ๋ธ๋๋ฆฌ์คํธ์ ์ถ๊ฐํด์ผ ํ์คํ๊ฒ ์ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ด์จ๋ ๊ฐ ์์ฒญ์ ๋ํด DB ์์ฒญ์ํด์ผํฉ๋๋ค.
์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์๊ณ ์์ ๋ ์ง๋ 40์ผ ๋์์ ๋ชจ๋ accessTokens๋ฅผ ๋ธ๋๋ฆฌ์คํธ์ ์ฌ๋ ธ์ต๋๋ค. ์๋ํ๋ฉด ์ accessTokens์ ์ ํจ ๊ธฐ๊ฐ์ด 40์ผ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค...
HTTPS ์์ฒญ์ ์ฌ์ฉํ๋ฉด ์ค๊ฐ์ ๊ณต๊ฒฉ์ด ์ ๋ง ์ด๋ ค์์ง๋๋ค. HTTPS ์์ฒญ์ ์ฌ์ฉํ๊ณ ์์ง ์์ต๋๊น?
๋ฌผ๋ก ์ ๋ https๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง accessToken์ ํ์น ๊ฐ๋ฅ์ฑ์ 3๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ ํด๋ผ์ด์ธํธ ์ธก(์: XSS), ๋ ๋ฒ์งธ๋ ์ ์ก(๊ฐ์ด๋ฐ ์ฌ๋), ์ธ ๋ฒ์งธ๋ ์๋ฒ ์ธก์ ๋๋ค.
ํด๋ผ์ด์ธํธ์ ์ ์ก์์ ๋๋ ๋ณด์์ ๋ํ ์ ๋ฐ๋ง ์ฑ ์์ง๊ณ ๋๋จธ์ง ์ ๋ฐ์ ๋ด ํต์ ํ์ ์์ง ์์ ํด๋ผ์ด์ธํธ์ ๋๋ค. ํ์ง๋ง XSS๋ฅผ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ https๋ก ์ ์ก์ ๋ณดํธํจ์ผ๋ก์จ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด์ ์ํ์ ํผํ๋๋ก ๋์ธ ์ ์์ต๋๋ค.
refreshToken์ ๋ชฉํ๋ accessToken์ ๋ง๋ฃ๋ฅผ ๋ ์งง๊ฒ ๋ง๋ค๊ณ ๊ฐ ์์ฒญ์ ๋ํด ๋ ๊ธธ๊ฑฐ๋ ๋ฌดํํ ์ ํจํ ํ ํฐ์ ์ ์กํ์ง ์๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์ด๊ฒ์ด ์ ๊ณตํ๋ ์ ์ผํ ๋ณด์์ 100๊ฐ์ ์์ฒญ์์ ์ฆ, ์ ์ก ์ 100๊ฐ ๋ชจ๋๋ฅผ ์ทจ์ฝํ๊ฒ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ 1๊ฐ์ ์์ฒญ๋ง ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๊ฐ ๊ณต๊ฒฉ์๋ refeshToken์ ์ํด ๋ณดํธ๋ ์ ์์ผ๋ฉฐ ๋ฌผ๋ก XSS์ ์ํด ๋ณดํธ๋์ง ์์ต๋๋ค... ์ด refreshToken์ ์ ์กํ๋ ํ์๋งํผ ์ค์ผ ์ ์์ ๋ฟ์ ๋๋ค... ์ ์ก ๋น์ฉ์ ๋ ์ ์ต๋๋ค. ๊ทธ๋ฌ๋ accessToken์ ๋ ์ค๋ ์ ํจํด์ผ ํฉ๋๋ค...
Slack ์ฑ๋์์ ๋ด ๋๊ธ์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์๋ก๊ณ ์นจ ํ ํฐ์ ํ์ ์ง์ ๊ธฐ๋ฅ์ด๋ฉฐ ๊ธฐ์กด ์ก์ธ์ค ํ ํฐ์ ์๋์ผ๋ก ๊ฐฑ์ ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ก์ธ์ค ํ ํฐ์ ์ํ ๋น์ ์ฅ์ด๋ฉฐ ์๋ฒ ์ธก์ ์ ์ฅ๋์ง ์์ต๋๋ค. ๋จ์ ์ ์์ํ ์ ํจํ๋ค๋ ๊ฒ์ ๋๋ค! ์ก์ธ์ค ํ ํฐ์ด ๊ธธ์๋ก ๋ ๋ง์ ์ํ์ด ๋ถ๊ณผ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ก์ธ์ค ํ ํฐ์ด ๋๋ฌด ์งง์ผ๋ฉด ์ฌ์ฉ์๊ฐ ์์ฃผ ๋ก๊ทธ์ธํด์ผ ํ๋ฏ๋ก ์ฌ์ฉ์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ฆฌํ๋ ์ ํ ํฐ์ด ๋ค์ด์ค๋ ๊ณณ์ ๋๋ค. ์ก์ธ์ค ํ ํฐ์ ์๋ก ๊ณ ์น๋ ๋ฐ ์ฌ์ฉ๋๋ ํ ํฐ์ด๋ฉฐ ์๋ช ์ด ๊ธด ํ ํฐ์ ๋๋ค. ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ ์ก์ธ์ค ํ ํฐ์ ์ป์ ์ ์์ผ๋ฉฐ ์ด๊ฒ์ด ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ ์ผํ ๋ชฉ์ ์ ๋๋ค.
์ฌ์ฉ์ ๊ณ์ ์ด ๋์ฉ๋ ๊ฒฝ์ฐ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ทจ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ก์ธ์ค ํ ํฐ๊ณผ ์๋ก ๊ณ ์นจ ํ ํฐ์ ํฐ ์ฐจ์ด์ ์ ๋๋ค. ๋ฐ๊ธ๋ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ทจ์ํ๋ ค๋ฉด ์๋ฒ์์ ๋ฐ๊ธ๋ ๋ชจ๋ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ฆ, ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค. ์๋ฒ๋ ์ด๋ค ๊ฒ์ด ์ ํจํ์ง, ์ด๋ค ๊ฒ์ด ์ ํจํ์ง ์์์ง ์์์ผ ํฉ๋๋ค.
์๋ก ๊ณ ์นจ ํ ํฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ค๋ฉด ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ ์งํ๊ธฐ ์ํ ์ผ์ข ์ ํ ํฐ ์ ์ฅ์๊ฐ ํ์ํฉ๋๋ค. ๋ํ ์ต์ํ ์ธ ๊ฐ์ง ํ๋ฆ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
ํ ํฐ ์ ํจ์ฑ ๊ฒ์ฌ ์๋ก ๊ณ ์นจ
์ ํจํ ์๋ก ๊ณ ์นจ ํ ํฐ์ผ๋ก ์ก์ธ์ค ํ ํฐ ์๋ก ๊ณ ์นจ
์์๋ ์ฌ์ฉ์์ ์๋ก ๊ณ ์นจ ํ ํฐ ์ทจ์
ํ ํฐ ์ฌ์ฉ ํต๊ณ์ ๊ฐ์ ๋ค๋ฅธ ๊ด๋ฆฌ ๊ธฐ๋ฅ๋ ์์ผ๋ฉด ์ข์ต๋๋ค.
์๋ ์๋ก ๊ณ ์นจ ํ ํฐ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํ์ฌ ์ดํด์ ๋๋ค. ์ฝ์ง๋ ์์ง๋ง ๋ณด๋ค ์์ ํ ์์คํ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ฐ๋์ ํ์ํฉ๋๋ค.
์๋ก ๊ณ ์นจ ํ ํฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ/๋ชจ๋์ด Feathers์ ์ด๋ฏธ ๋ด์ฅ๋์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
TheSinding(https://github.com/TheSinding/authentication-refresh-token)์ด ์ํํ ์์ ์ ๊ธฐ๋ฐ์ผ๋ก, ํ๋์ ์ฌ์ฉ์ ์ง์ ์๋น์ค์ ์ธ ๊ฐ์ ํํฌ(https://github.com/ ๊ธฐ๋ณธ ์๋ก ๊ณ ์นจ ํ ํฐ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ jackywxd/feathers-refresh-token):
Feathres์ ๊ธฐ์กด ์ฝ๋ ๊ธฐ๋ฐ์ ์ต๋ํ ํ์ฉํ๋ฉด์ ์ค์ ์ฝ๋ฉ ๋ ธ๋ ฅ์ ์ต์ํ๋์์ผ๋ฉฐ ํ์ฌ Feathers ์ํคํ ์ฒ์ ์ ํตํฉ๋ฉ๋๋ค. ํ์ฌ Feathers ์ํคํ ์ฒ๊ฐ ๋งค์ฐ ํ์ฅ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํฉ๋๋ค.
๊ทธ๋ฌ๋ Refresh-token์ ์ ์ฒด ๊ธฐ๋ฅ์ ํด๋ผ์ด์ธํธ ์ธก์์ ์๋ก ๊ณ ์นจ ํ ํฐ ์ ์ฅ, ์ก์ธ์ค ํ ํฐ ๋ง๋ฃ ํ ์ฌ์ฉ์ ์ฌ์ธ์ฆ, ์๋ก ๊ณ ์นจ ํ ํฐ์ผ๋ก ์ฌ์ฉ์ ๋ก๊ทธ์์๊ณผ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ธก ์ง์๋ ํ์ํฉ๋๋ค.
feather-authentication ๋ฐ authentication-client์ ์์ค ์ฝ๋๋ฅผ ๊ฒํ ํ ํ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ธ์ฆ์ ์ผ๋ ๊ฒ๋งํผ ์ฝ๊ฒ ์๋ก ๊ณ ์นจ ํ ํฐ ์ง์์ ์ผค ์ ์๋๋ก ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ธฐ์กด ๊ธฐ๋ฅ ์ฝ๋์ ํญํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด ํํฌ ๋ฒ์ ์๋ก ๊ณ ์นจ ํ ํฐ ์ฝ๋ ๊ธฐ๋ฐ์ @feathersjs/authentication์ผ๋ก ์ด๋ฏธ ์ด์ํ์ต๋๋ค. ๋ค์์ผ๋ก ํด๋ผ์ด์ธํธ ์ธก ๊ธฐ๋ฅ์ ํ์ฑํํ๊ธฐ ์ํด ์ธ์ฆ ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํฉ๋๋ค. ์ ๊ถ๊ทน์ ์ธ ๋ชฉํ๋ ์๋ฒ ์ธก๊ณผ ํด๋ผ์ด์ธํธ ์ธก ๋ชจ๋์์ ์๋ก ๊ณ ์นจ ํ ํฐ ์ง์์ ํ์ฑํํ๋ ๊ฒ์ ๋๋ค.
๋ด ์ง๋ฌธ/๊ด์ฌ์ ์๋ก ๊ณ ์นจ ํ ํฐ์ด ํด๋ผ์ด์ธํธ์ ์ด๋ป๊ฒ ์ ์ฅ๋ฉ๋๊น?
https://auth0.com/blog/securing-single-page-applications-with-refresh-token-rotation/ ์ฐธ์กฐ
๋ถํํ๋ ์๋ช ์ด ๊ธด RT๋ SPA์ ์ ํฉํ์ง ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์๋ ์๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ง ์ก์ธ์ค๋ฅผ ๋ณด์ฅํ ์ ์๋ ์๊ตฌ ์ ์ฅ ๋ฉ์ปค๋์ฆ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ๊ณ ๊ฐ์น ์ํฐํฉํธ๋ฅผ ํ๋ํ๊ณ ์ ์์ ์ธ ํ์์๊ฐ ๋ณดํธ๋ ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๊ธฐ ์ํด ์ ์ฉ๋ ์ ์๋ ์ทจ์ฝ์ ์ด ์์ผ๋ฏ๋ก SPA์์ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ํ ํฐ์ ์์ ํ๊ฒ ๋ณด๊ดํ ์ ์๋ ๊ฐ์ฅ ์ข์ ์ฅ์๋ ์ด๋์ผ๊น์? ์์ ํ ์์ ํ ์คํ ๋ฆฌ์ง๋ฅผ ํ๋ณดํ๋ ค๋ ์ด์ ์ด ์๋ค๋ฉด ์ธํฐ๋ท์์ ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฝ์ ์ ์์ต๋๋ค. ์ผ๋ถ ์๋ฃจ์ ์ ์ด์์ ์ด์ง๋ง ๊ทธ๋ค์ง ์ค์ฉ์ ์ด์ง ์์ต๋๋ค. ์ค์ ๋ก httpOnly ๋ฐ Secure ํ๋๊ทธ๊ฐ ์๋ ์ฟ ํค์ ์ ์ฅํฉ๋๋ค. 100% ์์ ํ์ง๋ ์์ง๋ง ์์ ์ ์๋ฃํฉ๋๋ค.
์ฟ ํค์ ๋ํ ์ด ๊ธด ํ ๋ก ์ ์ฐธ์กฐํ์ญ์์ค - https://github.com/feathersjs-ecosystem/authentication/issues/132 too
@bwgjoseph ์ผ๋ฐ ์ต์คํ๋ ์ค ์ธ์ ์ ์ฌ์ฉํ๊ณ ํด๋ผ์ด์ธํธ ์ธก ๋์ ๋ชจ๋ ํ ํฐ์ ๊ฑฐ๊ธฐ์ ์ ์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ด๊ฐํ๋ ์ผ์ด๋ฉฐ SPA๋ฅผ ํฌํจํ ๋ชจ๋ ์ ํ์ ์ฑ์์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
@sarkistlt ๋ชจ๋ ํด๋ผ์ด์ธํธ JWT ํ ํฐ์ ์๋ฒ ์ธก์ ์ ์ฅํ๋ค๋
@bwgjoseph ์ธ์ ๋์ฒ๋ผ ์ฟ ํค, ์๋น์ค๋ฅผ ๋ฑ๋กํ๊ธฐ ์ ์
app.use('* | [or specific rout]', session(sess), (req, res, next) => {
req.feathers.session = req.session || {};
next();
});
๊ทธ๋ฐ ๋ค์ ์๋ฒ์์ ๊ณ ๊ฐ ๋ก๊ทธ์ธ ์๋น์ค์ ๊ฒฝ์ฐ ๊ณ ๊ฐ์ด ์ธ์ฆ๋๋ฉด ctx.params.session.token = token
์ ๊ฐ์ ์ธ์
์ ํ ํฐ์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ํ ํฐ์ JWT ์ก์ธ์ค ๋๋ ์๋ก ๊ณ ์นจ ํ ํฐ์ด๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์
๋
ผ๋ฆฌ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ก์ด ์์ฒญ์ด ์์ผ๋ฉด ์ธ์
์ ํ ํฐ์ด ์๋์ง ํ์ธํ๊ณ ์ด๋ฅผ ์ธ์ฆ์ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ํด๋ผ์ด์ธํธ ์ธก์์ ํ ํฐ์ด ์ ํ ๋
ธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ํจ์ฌ ๋ ์์ ํ๊ณ ์์ ํ ์ ๊ทผ ๋ฐฉ์์
๋๋ค.
๋๋ ์ด๊ฒ์ด ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ) - ์๋ฒ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฅ ์ ์๋ํ๋ค๊ณ ๋ง๋ถ์ด๊ฒ ์ต๋๋ค. ์๋ฒ ๋๋ ์์ ์/์๋ฒ ๊ฐ์ ๋ด๋ถ์ ์ผ๋ก ํต์ ํ ๋๋ ์ธ์ ์ด ํ์ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ์ด์ ์ _๋ง์ด_ ๋ ผ์๋์์ผ๋ฉฐ(๋ํ FAQ์ ํญ๋ชฉ์ ์ถ๊ฐํ์ต๋๋ค) ์ธ์ ์ ํ ํฐ์ ์ ์ฅํ๋ ๊ฒ์ด ๋ฐ๋์ ๋ ์์ ํ ๊ฒ์ ์๋๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋๋ก ํ์ด์ง์ ์ก์ธ์คํ๋ฉด ์ธ์ ์ ๊ฐ๋ก์ฑ๊ณ ์ด์จ๋ ์ธ์ฆ๋ ์์ฒญ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ํ ํฐ์ ์๋ฅผ ๋ค์ด localStorage(ํ์ฌ ํ์ด์ง์๋ง ์ก์ธ์คํ ์ ์์)์ ์ ์ฅํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ๋ค๋ฅธ ํ๋ซํผ(๋ค์ดํฐ๋ธ ๋ชจ๋ฐ์ผ ์ฑ, ์๋ฒ ๊ฐ ๋ฑ)๊ณผ๋ ์ํํ๊ฒ ์๋ํฉ๋๋ค. websockets__ (์น ์์ผ์ด HTTP ์ฟ ํค๋ก ์ํํ๊ณ ์์ ํ๊ฒ ์๋ํ๋๋ก ํ๋ ๊ฒ์ด ์ผ๋ง๋ ๊ณ ํต์ค๋ฌ์ด์ง ์ถฉ๋ถํ ๊ฐ์กฐํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ํ๋ ค๊ณ ํ์ง ์์ ์ดํ๋ก ์ ์ถ์ ํจ์ฌ ์ฌ์์ก์ต๋๋ค). ์ผ๋ฐ์ ์ผ๋ก ์๋ก ๊ณ ์นจ ํ ํฐ์ ์๋ช ์ด ํจ์ฌ ๋ ๊ธธ๊ธฐ ๋๋ฌธ์ ์ทจ์ํ ์ ์์ด์ผ ํฉ๋๋ค.
์ด๋ ์ชฝ์ด๋ , ์ด๊ฒ์ ๋ํ ํ ๋ฆฌํ์คํธ๋ ๋งค์ฐ ํ์๋ฐ์ ๊ฒ์ ๋๋ค. ์ธ๋ถ ์ฌํญ์ ํจ์ฌ ์ฝ๊ฒ ๋ค๋ฆผ์งํ ์ ์์ต๋๋ค.
@jackywxd - ํ๋ฅญํ ์์
์
๋๋ค. ๊ฐ๋จํ ์ดํด๋ณด์๊ณ ๋ช ๊ฐ์ง ํ๋ฅญํ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์จ๋ ๊ฐ๋ฐ์๊ฐ ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๊น?
๋ง๋ ํํฌ๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉํ๋ ๊ฒ์ฒ๋ผ ๋์ค์ ํํฌ๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๊น?
ํ ๋ฆฌํ์คํธ๋ฅผ ์์ฑํ๊ณ ๊ฑฐ๊ธฐ์์ ํ ๋ก ์ ํ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@daffl ์, ํนํ WS์ ๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ์ ๋ฐฑ์๋๊ฐ ๋ชจ๋ ๊ทํ ๋๋ ๊ทํ์ ํ์ ์ํด ๊ตฌ์ถ๋๋ ๊ฒฝ์ฐ JWT๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ถ๊ฐ ์ข
์์ฑ๊ณผ ๋ณต์ก์ฑ์ ํผํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ์๋ฅผ ๋ค์ด ํ์ฌ ํ์ฌ/๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ ์์ ์ REST-API๋ฅผ ๊ตฌ์ถํ ๋ ์ผ๋ฐ ์ธ์
์ ์ฌ์ฉํ๊ณ ๊ฐ๋ฐ์์๊ฒ ์์ฒญ์ ์๊ฒฉ ์ฆ๋ช
์ ํฌํจํ๋๋ก ์์ฒญํ ๋ค์ ์ก์ธ์ค(๋ฐ ์๋ก ๊ณ ์นจ) ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋๋ก ์์ฒญํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ) ํ ํฐ์ ์ ์ฅํ๊ณ ๊ฐ ์์ฒญ๊ณผ ํจ๊ป ์ ๋ฌํฉ๋๋ค. ํ๋ ํด๋ผ์ด์ธํธ์์ ์๋ฒฝํ๊ฒ ์ฒ๋ฆฌํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ๋ฐฑ์๋ ๋น๋ ๋ฐฉ๋ฒ์ ์ต์ํ์ง ์์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ request, superagent, fetch or axios
๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฑ์๋์ ์ฐ๊ฒฐํฉ๋๋ค. ์ ์ด๋ ์ ๊ฒฝ์ฐ์๋ ์ด๊ฒ์ด JWT๊ฐ ์๋ ์ผ๋ฐ ์ธ์
์์ ์ง์ ์๋ํ๋๋ก API์ ์ฒซ ํ๋ฉด ๋ถ๋ถ์ ์ด๋ํ๋ ์ฃผ๋ ์ด์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด ๊ฒฐ์ ์ ์ปค๋ฎค๋ํฐ์ "๊ฐ์ "ํ๋ ๋์ ์์ฒด API๋ก ๊ตฌํํ ๋ค์ ์ด ๊ธฐ๋ฅ์ ์ ์ ํ๊ฒ ๋ฌธ์ํํ๋ ๊ฒ์ด ๋์์ธ ๊ฒฐ์ ๊ณผ ์ฑ ์์ด ํด๋น ์์ ์ ์ ์์์๊ฒ ์์ง ์์๊น์?
@TheSinding ์ฌ์ฉ์ ์ธ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ ๊ทผ ๋ฐฉ์์ธ ์ฟ ํค๊ฐ ์๋๋ผ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋ํด '๊ฐ์ '๋ผ๊ณ ๋งํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค, API๋ฅผ ์ฌ์ฉํด ์จ ๊ฐ๋ฐ์๋ค์ ํผ๋๋ฐฑ์ ๋ฐ์ ๋์์ธ ๊ฒฐ์ ์ ํ ๊ฒ์ ๋๋ค. ์ฌ๋ฌ ํ์์ ์ฌ์ฉํ๋ ๋ค์ค ํ ๋ํธ ์์คํ ๋๋ API๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ, ํนํ ๋์ฒด ์๋ฃจ์ ์ด ์ต์ข ์ฌ์ฉ์์๊ฒ ์ด์ ์ ์ ๊ณตํ์ง ์๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ถ๊ฐ ํผ๋๊ณผ ์ถ๊ฐ ์๊ฐ์ ์๋นํ์ง ์๋๋ก ์ผ๋ฐ์ ์ธ ์ ๊ณ ๊ดํ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง JWT๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํ๋ฅญํ๊ณ ํนํ ์ค์๊ฐ API์ ํ์ฉํ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ฝ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ 90%์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์
๋๋ค. + ์ฟ ํค ์ธ์
์ ๊ด๋ฆฌํ๊ธฐ ์ํด redis ๋๋ ๋ค๋ฅธ ๊ฒ์ ์คํํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ต์ ์ ์ ํ์ด ์๋ ์ ์๋ ์์ธ์ ์ธ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ์ด์ ์๊ฒฌ์์ ํด๋น ์ํฉ์ ์๋ฅผ ๊ฐ์ ธ์์ต๋๋ค.
๋๋ ๋น์ ์ด ํ๋ ธ๋ค๊ณ ๋งํ ๊ฒ์ด ์๋๋ผ "ํฐ ์๋ฆฌ๋ก"์๊ฐํ์ต๋๋ค :)
IMO, JWT๋ฅผ ์ฌ์ฉํ ์ ๊ทผ ๋ฐฉ์์ด ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฏธ ์ง์๋๊ณ @daffl ๋ก ์์ ํ๊ธฐ๋ ๋ ์ฝ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ชจ๋ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! JWT ๋ ์ธ์ ์ ๋ณ๋๋ก ๋ ผ์ํ ์ ์๋ ๋ค๋ฅธ ์ฃผ์ ์ ๋๋ค.
์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋์ํ๋ ํ ๊ฐ์ง๋ ์ก์ธ์ค ํ ํฐ + ์๋ก ๊ณ ์นจ ํ ํฐ์ด ๋จ์ํ ์ก์ธ์ค ํ ํฐ๋ณด๋ค ํจ์ฌ ๋ ์์ ํ ์๋ฃจ์ ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฃผ์ ์ธํฐ๋ท ๊ฑฐ์ธ์ ์ํด ๋๋ฆฌ ์ฑํ๋์์ต๋๋ค. Feathers ์ปค๋ฎค๋ํฐ๋ ์๋ก ๊ณ ์นจ ํ ํฐ์ ๋ํ ๊ธฐ๋ณธ ์ ๊ณต ์ง์์ ์ ๊ณตํ๊ธฐ ์ํด Feathers ๊ธฐ๋ณธ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ณด๊ณ ์ถ์ดํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ํ๋นํฉ๋๋ค. ์ฌ์ค Feathers๊ฐ ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ง์ํ์ง ์๋๋ค๋ ์ฌ์ค์ ์ฒ์ ์์์ ๋ ๋๋์ต๋๋ค.
์ ๋ ๋ช ๊ฐ์ง ํ๋ก์ ํธ์์ AWS cognito๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. AWS Amplify๋ ID ํ ํฐ, ์ก์ธ์ค ํ ํฐ ๋ฐ ์๋ก ๊ณ ์นจ ํ ํฐ๊ณผ ๊ฐ์ ์ธ ๊ฐ์ง ํ ํฐ์ localStorage์ ์ ์ฅํฉ๋๋ค. Amplify๋ ํ ํฐ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ๋ชจ๋ ๋๋ฌ์ด ์์ ์ ์ฒ๋ฆฌํ๊ณ ์ฝ๊ณ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง API๋ฅผ ์ ๊ณตํฉ๋๋ค. Cognito ๋ฐฑ์๋์ ํจ๊ป ์๋ํ๋ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค. Feathers์ ๋น์ทํ ๊ฐ๋ฐ ๊ฒฝํ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
@Sinding ์ด์ ์ ํ๋ฅญํ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๊ธฐ์กด ์ธ์ฆ์ ์ผ๋ฐ ์๋น์ค๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ํ์ฅํ๊ณ ๋ช ๊ฐ์ ํํฌ๋ฅผ ์ถ๊ฐํ์ฌ ์๋ก ๊ณ ์นจ ํ ํฐ ์ง์์ ์ฝ๊ฒ ํ์ฑํํ ์ ์์ต๋๋ค.
this.hooks({
after: {
create: [issueRefreshToken(), connection('login'), event('login')],
remove: [logoutUser(), connection('logout'), event('logout')],
patch: [refreshAccessToken()],
},
CLI๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์ ์ผ๋ ๊ฒ์ฒ๋ผ ์๋ก ๊ณ ์นจ ํ ํฐ ์ง์์ ์ํด CLI์์ ์ ์ฌํ ์ต์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๊ฐ๋จํ ์๋ผ๊ณ ๋๋ตํ๋ฉด CLI๊ฐ ์๋์ผ๋ก ๊ณ ๊ฐ "์๋ก ๊ณ ์นจ ํ ํฐ" ์๋น์ค๋ฅผ ๋ง๋ค๊ณ ๊ธฐ๋ณธ ๊ตฌ์ฑ ํ์ผ์์ ์๋ก ๊ณ ์นจ ํ ํฐ ๊ด๋ จ ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ฅผ ์ํ ํดํค ์๋ฃจ์ ๊ณผ ๊ฐ์ต๋๋ค.
@daffl David, ๊นํธ์ ๋ง๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! Feathers์ ๋ํ "๊ธฐ์ฌ ๊ฐ์ด๋", "์ฝ๋ฉ ๊ฐ์ด๋๋ผ์ธ", "์คํ์ผ ๊ฐ์ด๋"๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ด์ ์ ์ธ๊ธํ๋ฏ์ด ์๋ก ๊ณ ์นจ ํ ํฐ(๋๋ ์ผ๋ถ ์์ด๋์ด)์ ๊ตฌํํ๋ PR์ ๋งค์ฐ ํ์ํ ๊ฒ์ ๋๋ค. ์์ง ๋งํฌ๋ ์ ์ฅ์๋ฅผ ํ์ธํ ๊ธฐํ๊ฐ ์์๊ณ ์ด ํ ๋ก ์ด ๊ฝค ๊ธธ์ด์ง๊ณ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ํ ๊ณณ์์ ์ต์ ์ํ๋ก ์ ์งํ๋ฉด ์ผ์ด ํจ์ฌ ์ฌ์์ง๋๋ค. ๋ช ๊ฐ์ง ์ค์ํ ๊ธ๋จธ๋ฆฌ ๊ธฐํธ:
๋๊ตฐ๊ฐ๊ฐ refreshToken์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌด ์ฌ์ด "์ธ์ "๊ณผ ๊ฐ์ ํ๋ก ํธ์๋, accessToken ๋ฐ refreshToken์ ์ฒ๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค.
ํ ํฐ์ ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง๋ฃ๋ ๋ refreshToken์ ์ฌ์ฉํ์ฌ ์ acessToken์ ์ป์ผ๋ ค๊ณ ์๋ํฉ๋๋ค. ํ์ฌ Videsk ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ ์ฅ์: ์ ๋ฉด ์ธ์ฆ ์ฒ๋ฆฌ๊ธฐ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๊ธฐ๋ฅ์ React Native ์ฑ๊ณผ ๊ด๋ จํ์ฌ MUST์ ๋๋ค. ์ฌ์ฉ์๋ ์ฒ์์ ๋ก๊ทธ์ธํ๊ณ ๋ช ์ฃผ ํ์ ์ฑ์ ์ด๋ฉด ์ฌ์ ํ ๋ก๊ทธ์ธ๋์ด ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.