Skip to content
Snippets Groups Projects
Commit f5494995 authored by Jaeyong Lee's avatar Jaeyong Lee
Browse files
parents fc30df1c 1bd0b27a
No related branches found
No related tags found
No related merge requests found
...@@ -10,9 +10,11 @@ ...@@ -10,9 +10,11 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"axios": "^1.6.1", "axios": "^1.6.1",
"cookie-parser": "^1.4.6",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"express": "^4.18.2", "express": "^4.18.2",
"moment": "^2.29.4",
"mongoose": "^8.0.1", "mongoose": "^8.0.1",
"nodemon": "^3.0.1" "nodemon": "^3.0.1"
}, },
...@@ -341,6 +343,26 @@ ...@@ -341,6 +343,26 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/cookie-parser": {
"version": "1.4.6",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
"integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
"dependencies": {
"cookie": "0.4.1",
"cookie-signature": "1.0.6"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/cookie-parser/node_modules/cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
"integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-signature": { "node_modules/cookie-signature": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
...@@ -835,6 +857,14 @@ ...@@ -835,6 +857,14 @@
"node": "*" "node": "*"
} }
}, },
"node_modules/moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"engines": {
"node": "*"
}
},
"node_modules/mongodb": { "node_modules/mongodb": {
"version": "6.2.0", "version": "6.2.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
......
...@@ -13,9 +13,11 @@ ...@@ -13,9 +13,11 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"axios": "^1.6.1", "axios": "^1.6.1",
"cookie-parser": "^1.4.6",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"express": "^4.18.2", "express": "^4.18.2",
"moment": "^2.29.4",
"mongoose": "^8.0.1", "mongoose": "^8.0.1",
"nodemon": "^3.0.1" "nodemon": "^3.0.1"
}, },
......
...@@ -2,6 +2,8 @@ import express from "express" ...@@ -2,6 +2,8 @@ import express from "express"
import cors from 'cors' import cors from 'cors'
import path from 'path' import path from 'path'
import process from 'process' import process from 'process'
import moment from 'moment';
import cookieParser from 'cookie-parser';
import db from './db.js' import db from './db.js'
...@@ -12,19 +14,21 @@ db.connectDB(); ...@@ -12,19 +14,21 @@ db.connectDB();
app.use(express.static(path.join(process.cwd(), '../frontend/build'))); app.use(express.static(path.join(process.cwd(), '../frontend/build')));
app.use(cookieParser());
app.use(express.json()); app.use(express.json());
app.use(express.urlencoded({ extended: false })); app.use(express.urlencoded({ extended: false }));
app.use(cors()); app.use(
cors({
origin: 'http://localhost:3000',
credentials: true,
})
); //cors 설정을 한다..
app.listen(PORT, () => { app.listen(PORT, () => {
console.log(`Listening on port ${PORT}`); console.log(`Listening on port ${PORT}`);
}); // 서버 실행 }); // 서버 실행
/*
app.get('/', function (req, res) {
res.sendFile(path.join(process.cwd(), '../frontend/build/index.html'));
});
*/
function b64_to_utf8( str ) { function b64_to_utf8( str ) {
return decodeURIComponent(escape(window.atob( str ))); return decodeURIComponent(escape(window.atob( str )));
} }
...@@ -34,10 +38,16 @@ function encode_utf8(s) { ...@@ -34,10 +38,16 @@ function encode_utf8(s) {
} }
app.post('/login', (req, res) => { app.post('/login', (req, res) => {
const text = req.body; /*
console.log(req.body); TODO: 토큰의 무결성 체크
토큰이 이상이 없다면, 로그인/회원가입 로직을 수행 후 jwt 쿠키를 보낸다.
*/
const expires = moment().add('2','m').toDate()
res.cookie('jwt', JSON.stringify(req.body), {expires});
//통과 못하면 에러를 뱉는다
res.send(req.body.name); res.send(req.body.name);
//res.redirect(200, "/main");
}); });
......
...@@ -16,7 +16,10 @@ ...@@ -16,7 +16,10 @@
"base-64": "^1.0.0", "base-64": "^1.0.0",
"express": "^4.18.2", "express": "^4.18.2",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
"moment": "^2.29.4",
"react": "^18.2.0", "react": "^18.2.0",
"react-cookie": "^6.1.1",
"react-cookies": "^0.1.1",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-kakao-maps-sdk": "^1.1.24", "react-kakao-maps-sdk": "^1.1.24",
"react-router-dom": "^6.18.0", "react-router-dom": "^6.18.0",
...@@ -4264,6 +4267,11 @@ ...@@ -4264,6 +4267,11 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/cookie": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz",
"integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA=="
},
"node_modules/@types/eslint": { "node_modules/@types/eslint": {
"version": "8.44.7", "version": "8.44.7",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz",
...@@ -4323,6 +4331,15 @@ ...@@ -4323,6 +4331,15 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/hoist-non-react-statics": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
"integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
"dependencies": {
"@types/react": "*",
"hoist-non-react-statics": "^3.3.0"
}
},
"node_modules/@types/html-minifier-terser": { "node_modules/@types/html-minifier-terser": {
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
...@@ -9618,6 +9635,19 @@ ...@@ -9618,6 +9635,19 @@
"he": "bin/he" "he": "bin/he"
} }
}, },
"node_modules/hoist-non-react-statics": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
"integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
"dependencies": {
"react-is": "^16.7.0"
}
},
"node_modules/hoist-non-react-statics/node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/hoopy": { "node_modules/hoopy": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
...@@ -13418,6 +13448,14 @@ ...@@ -13418,6 +13448,14 @@
"mkdirp": "bin/cmd.js" "mkdirp": "bin/cmd.js"
} }
}, },
"node_modules/moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"engines": {
"node": "*"
}
},
"node_modules/ms": { "node_modules/ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
...@@ -13587,7 +13625,6 @@ ...@@ -13587,7 +13625,6 @@
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
...@@ -15705,6 +15742,36 @@ ...@@ -15705,6 +15742,36 @@
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
"dev": true "dev": true
}, },
"node_modules/react-cookie": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-6.1.1.tgz",
"integrity": "sha512-fuFRpf8LH6SfmVMowDUIRywJF5jAUDUWrm0EI5VdXfTl5bPcJ7B0zWbuYpT0Tvikx7Gs18MlvAT+P+744dUz2g==",
"dependencies": {
"@types/hoist-non-react-statics": "^3.3.1",
"hoist-non-react-statics": "^3.3.2",
"universal-cookie": "^6.0.0"
},
"peerDependencies": {
"react": ">= 16.3.0"
}
},
"node_modules/react-cookies": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/react-cookies/-/react-cookies-0.1.1.tgz",
"integrity": "sha512-PP75kJ4vtoHuuTdq0TAD3RmlAv7vuDQh9fkC4oDlhntgs9vX1DmREomO0Y1mcQKR9nMZ6/zxoflaMJ3MAmF5KQ==",
"dependencies": {
"cookie": "^0.3.1",
"object-assign": "^4.1.1"
}
},
"node_modules/react-cookies/node_modules/cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
"integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/react-dev-utils": { "node_modules/react-dev-utils": {
"version": "12.0.1", "version": "12.0.1",
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
...@@ -18137,6 +18204,15 @@ ...@@ -18137,6 +18204,15 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/universal-cookie": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.1.tgz",
"integrity": "sha512-33S9x3CpdUnnjwTNs2Fgc41WGve2tdLtvaK2kPSbZRc5pGpz2vQFbRWMxlATsxNNe/Cy8SzmnmbuBM85jpZPtA==",
"dependencies": {
"@types/cookie": "^0.5.1",
"cookie": "^0.5.0"
}
},
"node_modules/universalify": { "node_modules/universalify": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
......
...@@ -11,7 +11,10 @@ ...@@ -11,7 +11,10 @@
"base-64": "^1.0.0", "base-64": "^1.0.0",
"express": "^4.18.2", "express": "^4.18.2",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
"moment": "^2.29.4",
"react": "^18.2.0", "react": "^18.2.0",
"react-cookie": "^6.1.1",
"react-cookies": "^0.1.1",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-kakao-maps-sdk": "^1.1.24", "react-kakao-maps-sdk": "^1.1.24",
"react-router-dom": "^6.18.0", "react-router-dom": "^6.18.0",
......
import { GoogleLogin } from "@react-oauth/google"; import { GoogleLogin } from "@react-oauth/google";
import { GoogleOAuthProvider } from "@react-oauth/google"; import { GoogleOAuthProvider } from "@react-oauth/google";
import { useNavigate, Navigate } from "react-router-dom"; import { useNavigate, Navigate } from "react-router-dom";
import { useCookies } from 'react-cookie'
// 안써도 자동으로 한국 시간을 불러온다. 명확하게 하기 위해 import
import moment from 'moment';
import 'moment/locale/ko';
import base64 from 'base-64'; import base64 from 'base-64';
import axios from 'axios'; import axios from 'axios';
axios.defaults.withCredentials = true;
/* /*
*/ */
const GoogleLoginButton = () => { const GoogleLoginButton = () => {
const [cookies, setCookie, removeCookie] = useCookies();
const clientId = '716858812522-rb0pfisq317unkh4so5hvbu16p19kqp8.apps.googleusercontent.com' const clientId = '716858812522-rb0pfisq317unkh4so5hvbu16p19kqp8.apps.googleusercontent.com'
const navigate = useNavigate(); const navigate = useNavigate();
const goMain = () => { const goMain = () => {
...@@ -30,14 +38,19 @@ const GoogleLoginButton = () => { ...@@ -30,14 +38,19 @@ const GoogleLoginButton = () => {
RS256 : 암호화 알고리즘, JWT 서명할 때 사용한다고 함 RS256 : 암호화 알고리즘, JWT 서명할 때 사용한다고 함
*/ */
console.log(res); // 쿠키 테스트 1분 뒤 만료
const expires = moment().add('1','m').toDate()
setCookie('cookieTest','hello',{expires})
let datas = res.credential.split('.') let datas = res.credential.split('.')
const obj = JSON.parse(b64DecodeUnicode(datas[1])); const obj = JSON.parse(b64DecodeUnicode(datas[1]));
console.log(obj);
let response = commuTest(obj); // 토큰을 보내 로그인 로직 처리
console.log(response); // 로그인이 정상적으로 되었다면 쿠키를 등록
let response = requestLogin(obj);
console.log(cookies.jwt)
if (response) { if (response) {
goMain(); goMain();
} }
...@@ -60,23 +73,19 @@ function b64DecodeUnicode(str) { ...@@ -60,23 +73,19 @@ function b64DecodeUnicode(str) {
}).join('')); }).join(''));
} }
async function commuTest(payloadObj) { async function requestLogin(payloadObj) {
const response = await axios({ const response = await axios({
url: 'http://localhost:8080/login', // 통신할 웹문서 url: 'http://localhost:8080/login', // 통신할 웹문서
method: 'post', // 통신할 방식 method: 'post', // 통신할 방식
data: payloadObj data: payloadObj
}); });
console.log(response) console.log(response)
if (response.status === 200) { if (response.status === 200) {
return response.data; return response.data;
} }
else { else {
return null; return null;
} }
} }
export default GoogleLoginButton export default GoogleLoginButton
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment