묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
refreshToken cookie에 저장할때에 템플릿 리터럴 사용하는 부분에서의 질문
//auth.service.ts import { Injectable, UnprocessableEntityException } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import * as bcrypt from 'bcrypt'; import { JwtService } from '@nestjs/jwt'; import { IAuthServiceGetAccessToken, IAuthServiceLogin, IAuthServiceSetRefreshToken, } from './interfaces/auth-service.interface'; @Injectable() export class AuthService { constructor( private readonly userService: UsersService, // private readonly jwtService: JwtService, ) {} async login({ email, password, context }: IAuthServiceLogin) { // 1. 이메일이 일치하는 유저를 DB에서 찾기 const user = await this.userService.findOneByEmail({ email }); // 2. 일치하는 유저가 없으면?! 에러 던지기!!! if (!user) throw new UnprocessableEntityException('존재하지 않는 이메일입니다.'); // 3. 일치하는 유저가 있지만, 비밀번호가 틀렸다면?! const isAuth = await bcrypt.compare(password, user.password); if (!isAuth) throw new UnprocessableEntityException('틀린 암호입니다.'); // 4. refreshToken(=JWT)을 만들어서 브라우저 쿠키에 저장해서 보내주기 this.setRefreshToken({ user, context }); // 5. 일치하는 유저도 있고, 비밀번호도 맞았다면?! // => accessToken(=JWT)을 만들어서 브라우저에 전달하기 return this.getAccessToken({ user }); } getAccessToken({ user }: IAuthServiceGetAccessToken): string { return this.jwtService.sign( { sub: user.id }, { secret: process.env.JWT_SECRET_KEY, expiresIn: process.env.JWT_ACCESS_TOKEN_EXPIRE, }, ); } setRefreshToken({ user, context }: IAuthServiceSetRefreshToken): void { const refreshToken = this.jwtService.sign( { sub: user.id }, { secret: process.env.JWT_REFRESH_SECRET_KEY, expiresIn: process.env.JWT_REFRESH_TOKEN_EXPIRE, }, ); //개발환경 context.res.setHeader( 'set-Cookie', `refreshToken=${refreshToken}; path=/;`, ); // 배포환경 // context.res.setHeader('set-Cookie', `refreshToken=${refreshToken}; path=/; domain=.mybacksite.com; SameSite=None; Secure; httpOnly`); // context.res.setHeader('Access-Control-Allow-Origin', 'https://myfrontsite.com'); } } 리프레쉬 토큰을 생성하는 과정에서 개발환경에 사용하는context.res.setHeader( 'set-Cookie', `refreshToken=${refreshToken}; path=/;`, );이 코드에 'refreshToken'의 이름을 <한글>로 사용하게되면 graphql로 API테스트를 할때 read에 대한 에러를 발생시키더라구요.쿠키의 이름을 바꿔서 생성하려고 했는데 한글로 생성이 되지 않는거는 nodejs의 기본 특성인걸까요!?참고이미지로 아래에 이미지를 붙여봅니다~궁금해요~~~ 이런내용들은 nodejs 공식문서에서 제가 잘 못찾는건지 궁금합니다. 공식문서에도 있을것 같아서 찾아보려고했는데 잘 못찾겠더라구요ㅠㅜ..
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
쿠키 & 세션을 REST API로 개발할 때
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]쿠키에 대해서 알게 되었지만 궁금한점이 있습니다.구글에 검색하다 본 기억이 있는데 쿠키 & 세션을 REST 개발환경에서는 못쓴다고 본적이 있는거 같은데 스프링 부트로 rest형식으로 개발할 때는 쿠키 & 세션을 못쓰는게 맞나요? 만약, 못쓰는게 맞다면 그러면 로그인 유지나 광고 3일 동안 안보겠습니다 같은 쿠키를 사용해야 할 때는 어떤식으로 시켜줘야나요? 리액트와 협업하면 프론트에게 맡겨야 하나요?
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
express server cookie관련 질문 드립니다.!
indexRouter.get('/', (req: Request, res: Response, next: NextFunction) => { console.log(req.cookies); const {name, pwd} = req.cookies; if (!name || !pwd) { res.sendFile(path.join(__viewPath, 'index.html')); } else { res.send(`${name}님 환영합니다!`); }});indexRouter.get('/login', (req: Request, res: Response) => { const {name, pwd} = req.query; const expire = new Date(); expire.setSeconds(30); const cookieOptions = { httpOnly: true, expires: expire, path: '/', }; res.cookie('name', name, cookieOptions) .cookie('pwd', pwd, cookieOptions) .redirect('/');});기존 쿠키서버를 express서버로 적용해보는 과정인데요, /login에서 받은 정보를 쿠키에 담고, redirect로 홈을 호출하고 있는데요,문제는 홈에서 보시면 req.cookies에 쿠키가 담겨있을때가 있고, 없을때가 있습니다."(console.log에서 쿠키값이 없을때: "[Object: null prototype]{}" 쿠키값이 존재할때: "{test:"test"}") 혹시 쿠키가 클라이언트에게 전송되기전에 redirect가 먼저 발생하여 쿠키값이 없어, index.html을 내보내는걸까요?6번 정도 시도한다고 가정할때 두번정도 쿠키값이 정상으로 전송되고, 나머지 4번 정도가 쿠키값이 없는 상태로 index가 호출됩니다;(정상결과와 아닌것은 순서가 없습니다;; 운이 좋으면되고 안좋으면 안되는 느낌입니다...)혹시 비동기 작업이랑 관련이 있을까여?
-
미해결
cookie 가 제대로 카운트 되지 않아요
get_cookie 를 통해서 어떠한 기능의 쿠키를 저장하고android와 ios에서 save_cookie로저장된 쿠키의 수가 10번 이상이면 모달화면을 띄우고 있어요cookie가 바르게 카운트 되지 않을 때는 어떻게 하면 좋을까요?!
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
쿠키 이해하기 강의 질문
쿠키 강의에서 18:00 부분 질문있습니다 아래 코드에서 처음에는 login으로 들어가서 로그인창이나옵니다 그리고 서버에서는 set cookie로 응답을 보내겠죠? 그러고 끝이 나야하는데 왜 처음 로그인할때는 ~~님 환영합니다 까지 뜨는건가요? 요청은 제가 한번 보낸것 아닌가요? 요청(처음로그인) -> 응답(302,쿠키 보내기) .. 여기서 재 요청을 하면 else if(cookies.name)이 작동해야하지만 왜 한번만 요청을 했는데 login , cookies.name 이렇게 2개가 작동하는건가요? if (req.url.startsWith('/login')) { const { query } = url.parse(req.url); const { name } = qs.parse(query); const expires = new Date(); // 쿠키 유효 시간을 현재시간 + 5분으로 설정 expires.setMinutes(expires.getMinutes() + 5); res.writeHead(302, { Location: '/', 'Set-Cookie': `name=${encodeURIComponent(name)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`, }); res.end(); // name이라는 쿠키가 있는 경우 } else if (cookies.name) { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(`${cookies.name}님 안녕하세요`); } else {
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
getServerSideProps 쿠키 이슈 관련해서 질문드립니다! 도와주세요ㅠ
안녕하세요, 제로초님 강의 잘 들었습니다. 강의를 듣고 혼자서 프로젝트를 진행하는데 너무 막히는점이 있어서 질문드립니다. 마이페이지에서 유저 정보를 불러오는 작업을 하고 있습니다. 토큰을 받아서 쿠키에 저장하여 사용하고 있는데.. 배포시에 저 말고 다른 사람도 저의 토큰으로 요청을 보내는 모습이 발견되었는데 해결을 못하고 있어요ㅠ 로초님 강의 후반부에서 보긴봤었는데 상황이 약간 다른거 같아서 질문드려요ㅠ saveCookies는 쿠키를 받아서 디스패치하여 스토어에 저장하는 함수이고 createCustomHeader는 Authorization : {`Bearer ${token}`}을 리턴하는 함수입니다. export const getServerSideProps = wrapper.getServerSideProps( (store) => async (context) => { saveCookies(store, context); const rootState: RootState = store.getState(); const user_id = rootState.loginState.user_id; axiosInstance.interceptors.request.use( async function (config) { try { config.headers = null; if (context.req && context.req.headers.cookie) { const allCookies = cookies(context); const accessToken = allCookies.accessToken; config.headers = createCustomHeader(accessToken); } return config; } catch (error) { console.log(error); } }, function (error) { return Promise.reject(error); }, ); store.dispatch(getUserInfoInMypageRequest(user_id)); store.dispatch(END); await store.sagaTask.toPromise(); return { props: {}, }; }, );
-
미해결Nuxt.js 시작하기
Nuxt 에서 Cookie 사용이 잘 안되네요..ㅠ.ㅠ
안녕하세요. 기초강의부터 Nuxt 강의까지 많이 도움을 받았습니다. 다름 아니라... Nuxt 에서 쿠키를 사용할려고 하는데 생각처럼 잘 안되네요... 로그인 구현후 인증값을 쿠키로 저장하고 store 의 state에 쿠키값이 존재시 state 의 데이터를 초기화 할려고 합니다. import Cookies from "js-cookie"; export const state = () => { userName = Cookies.get('userName') || ''; } store/index.js 에 위와 같이 state 값이 쿠키값을 초기화할려고 합니다. 하지만 userName 에 쿠키값이 초기화되지 않습니다. nuxtServerInit 등 여러삽질을 해봤지만 해결점을 찾지 못했습니다. Nuxt 에서 쿠키활용에 대해 설명해주시면 많은 도움이 될거같습니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
domain과 path는 어떻게 상호작용하나요?
쿠키의 도메인을 naver.com이라고 지정했습니다. 쿠키는 blog.naver.com 과 www.naver.com 에서 모두 보내집니다. www.naver.com/some 하위 경로에만 쿠키를 보내고 싶어서 path는 /some이라고 지정했습니다. 이 때 blog.naver.com에는 /some이라는 패스가 없다면 쿠키가 쿠키가 무시되고 만약 /some이라는 패스가 존재한다면 보내지게 되나요?
-
해결됨Vue로 Nodebird SNS 만들기
Nginx Cookie 설정
안녕하세요. 현재 강의를 수강 중에 https 설정 후 발생하는 문제가 있어서 질문드립니다. 현재 모든 강의를 수강하고 SSL 인증서를 적용하는 제로초님 블로그의 글을 따라 하고 있는데로그인은 되지만 로그아웃이 되지 않는 현상이 발생합니다.개발자도구 - 네트워크에 응답으로 withcredential 예외 응답이 오는 걸로 봐서는 쿠키 설정에 문제가 있는 것으로 추측됩니다.(Nginx 설정은 블로그에 있는 설정에 도메인만 바꿔서 적용하였고 다른 부분은 바꾼 것이 없습니다.)Nginx 설정에 쿠키를 보낼 수 있도록 적용하면 될거 같은데 혹시 다른 문제이진 않은가 걱정이 되어 글을 남깁니다.또한 혹시 https를 적용하고 또 설정해줘야 하는 부분이 짐작되는 것이 있으시다면 조언해주시면 감사하겠습니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
배포 후 log out 쿠키 삭제
안녕하세요. 현재 제로초님과 같은 코드로 passport-local로 로그인과 로그아웃을 구현하였습니다. 배포 후 https환경에서 log out하였을때 브라우저 상에서 쿠키가 삭제되지 않는것 같아서 질문드립니다 ㅠ 프론트와 백엔드는 같은 도메인을 사용하고 있고 서브도메인만 다른 상황입니다 ! (프론트: dimelo.io, 백엔드: api.dimelo.io) (https://stackoverflow.com/questions/13758207/why-is-passportjs-in-node-not-removing-session-on-logout 여기 글을 보고 req.session.destroy(function() { res.clearCookie('connect.sid'); }); 이렇게 해보았지만 그래도 안됐습니다 ...)
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
express aws 배포 후 세션 - 쿠키
선생님, 안녕하세요. 사실 이 질문이 여기에 해도 되는 질문인지 잘 모르겠지만 답변해주시면 감사하겠습니다. nest.js를 학습하기에 앞서 express 를 복습하고자 전에 개인적으로 만들었던 거를 한번 복습 후, 이번에 aws ec2에 배포까지 해보게 되었습니다. 로그인을 session으로 구현하였는데, 로컬에서는 클라이언트에 쿠키가 잘 전달 되었지만, ec2에 올리고 난 후 클라이언트에 쿠키가 전달되지 않아 도움을 청하고자 합니다. 우선 서버쪽 CORS 설정과 세션 설정은 이렇게 해주었습니다. app.use( cors({ origin: [ 'https://jh-client.ga' // 배포한 client url ], preflightContinue: true, credentials: true, }) ); app.use( session({ secret: 'jjj', proxy: true, store: new RedisStore({ client: redisClient, ttl: 3600 * 24 * 3, //3600초 = 1시간 // ttl: 10, }), saveUninitialized: true, resave: false, name: 'MySessionKey', cookie: { sameSite: 'none', secure: true, // httpOnly : true, // maxAge: 1000 * 60 * 60, // 1000밀리세컨드 : 1초 maxAge: 1000 * 60 * 60 * 5, }, }) ); 클라이언트와 server 모두 ACM을 통해 https 설정을 해주었고, 클라이언트에는 cloud front, 서버에는 elastic load balancer 도 적용해주었습니다. stack over flow나 다른 곳들을 찾아본 결과, sameSite = 'none', secure = true 설정을 해주면 대부분 된다고 하던데 (물론 클라이언트에서 axios 요청을 보낼때도 withCredentials : true 설정을 해주었습니다.) 저는 이것 외에도 추천하는 다양한 방법들을 시도해보았지만 잘 해결되지 않아 너무 답답한 마음에 질문 드렸습니다. 꼭 답변해주시면 감사하겠습니다 감사합니다~~
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
getServersideProps session 질문
안녕하세요! 강좌를 바탕으로 블로그를 제작하는 중에, 방문자 수를 counting 하는 기능을 구현하는데 막혀 질문드립니다. front server에서 getServerSideProps에 있는 export const getServerSideProps = wrapper.getServerSideProps(async (context) => { const cookie = context.req ? context.req.headers.cookie : ''; axios.defaults.headers.Cookie = ''; if (context.req && cookie) { axios.defaults.headers.Cookie = cookie; } context.store.dispatch({ type: LOAD_MY_INFO_REQUEST, }) context.store.dispatch({ type: LOAD_POSTS_REQUEST, }); context.store.dispatch(END); await context.store.sagaTask.toPromise(); }); LOAD_MY_INFO_REQUEST와 LOAD_POSTS_REQUEST를 이용해 back server에 요청을 날리면 back server에서는 app.js의 최상단에 존재하는 let count = 0; app.use((req,res,next) => { var date = new Date(); var today=date.getYear()+" "+date.getMonth()+" "+date.getDate(); console.log("lastvisit : " + req.session.lastVisit); if(req.session.lastVisit != today){ req.session.lastVisit = today; count++; } next(); }); 다음 함수를 이용해 방문자 수를 count할려고합니다! 문제는 front에서 먼저, LOAD_MY_INFO_REQUEST로 요청을 보내, session과 함께 응답을 받고 다시 LOAD_POSTS_REQUEST요청을 하면, 요청에는 첫번째 요청의 응답으로 넣어주었던 session이 존재하지 않는다는 점입니다. 몇일동안 잡고 있어도 도저히 해결책을 모르겠어 질문드립니다.
-
미해결화이트해커가 되기 위한 8가지 웹 해킹 기술
팝업창의 BEEFHOOK 정보 제거
스크립트 태그로 low 단계의 쿠키정보를 불러오는 곳에서 beef 까지 실습을 한 후 다시 쿠키정보를 불러오려니까 팝업창에 실습시 뜨는 쿠키정보와 더불어 BEEFHOOK 정보까지 같이 뜨는데 원래 보이는 것처럼 이를 없애고 싶습니다. 어떻게 되돌리나요?
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
Nginx Cookie Secure 관련 문의
안녕하세요. 스스로 해결해보려고 다양하게 시도했지만 문제 해결이 어려워 문의드립니다. back 쪽에서 nginx.conf 를 아래와 같이 수정했고, proxy_set_header 이외 넣어보라는 것들 5개 정도 넣어봤지만 잘안됐습니다. (restart) 후 systemctl status nginx 특별한 오류 없이 잘 작동됩니다. 1) 해결하기 위한 노력 app.set('trust proxy', 1); --> app.enable('trust proxy'); 로 수정 해봤습니다. 2) 해결하기 위한 노력 proxy, secure 모두 true 상태에서 계속해서 secure 체크가 안됩니다. true를 process.env.NODE.ENV === 'production'으로 수정을 해봤습니다. 계속해서 secure 체크가 안됩니다. 추가적으로 수정해야 할 부분이 있는지 문의 드립니다. if (process.env.NODE_ENV === 'production') { app.set('trust proxy', 1); app.use(morgan('combined')); app.use(hpp()); app.use(helmet({ contentSecurityPolicy: false })); app.use(cors({ origin: 'https://kakao.gg', credentials: true, }));} else { app.use(morgan('dev')); app.use(cors({ origin: true, credentials: true, }));}app.use('/', express.static(path.join(__dirname, 'uploads')));app.use(express.json());app.use(express.urlencoded({ extended: true }));app.use(cookieParser(process.env.COOKIE_SECRET));app.use(session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, proxy: true, cookie: { httpOnly: true, secure: true, domain: process.env.NODE_ENV === 'production' && '.kakao.gg' },}));
-
미해결실전 JSP (renew ver.) - 신입 프로그래머를 위한 강좌
loginok에서
login.jsp 화면에서 아이디 비밀번호 입력하면 loginok로 가서 정상적으로 쿠키 정보 확인되는데 다시 login.jsp로 가면 loginok.jsp가 아닌 다시 입력창이나오네요 어떻게 해야할까요 코드는 동일합니다
-
해결됨모든 개발자를 위한 HTTP 웹 기본 지식
쿠키에 관련해서 질문드립니다.
안녕하세요. 강의를 듣고 여러 프로젝트를 하면서 개념이 정리가 잘되지 않아서 이렇게 질문 드립니다. 실제로 일을 하다보면 여러 쿠키에 대한 여러 설정값이 나오더라구요. withcredentials, sameSite, secure, httponly 등등... 첫 번째로 서로 다른 도메인에서 쿠키를 주고 받으려면 클라, 서버 둘 다 withcredential = true 로 설정해야 된다는 것을 알고 있습니다. 만약 클라가 aaa.com이고 api요청을 api.aaa.com을 가지고 있는 서버에 준다고 하면 withcredential에 대한 설정을 어떻게 해야 하는 건지 궁금합니다. aaa.com과 api.aaa.com은 sameSite이고 서로 다른 origin 인것까지는 이해했습니다. 인터넷에 여러 글을 찾아봐도 어떤 글은 서로 다른 도메인간의 쿠키 전달이라고 명시되어 있는 반면 아떤 글은 서로 다른 origin 간의 쿠키 전달 옵션이라고 되어 있어 혼란스럽습니다. 결론적으로 1. 도메인과 서브 도메인의 도메인 일치 여부 2. withcredential 옵션의 기준 -> 서로 다른 도메인인지, 서로 다른 origin인지 3. sameSite 가 같은 도메인을 의미하는지 그래서 클라: aaa.com 서버: api.aaa.com 환경에서 withCredentials 설정을 해줘야하는지 궁금합니다. 답변해주시면 감사합니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
질문아니고 내용공유
쿠키못가져올 때 이렇게 하면댐. //Client Cookie에서 Token을 가져온다. let token = req.headers.cookie.split('x_auth=')[1];