묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
passport 모듈 배포 후 쿠키 저장 문제
안녕하세요!! 현재 프론트는 vue.js 백은 node.js로 개발중에 있는데요공식 문서랑 제로초님 책 보고 따라하면서 하고 있는데passport를 사용해서 로그인 로직을 구현했습니다로컬에서는 쿠키 저장도 잘 되고 로그인도 잘 되는데배포만 하면 쿠키가 생기기는 하는데 저장이 안 돼서 deserialize 가 안되어 로그인 자체가 안 되고 있습니다ㅜ세션이 문제인가 싶어서 이번에 cookie-session으로 바꿔봤는데도 로컬에서는 되고 배포후에는 안 되고 있습니다.배포 사이트는 둘 다 cloudtype으로 했고 도메인도 사서 설정을 해봤는데 안 됩니다ㅜㅜ app.js 파일입니다const express = require("express"); const cookieParser = require("cookie-parser"); const path = require("path"); const mysql = require("mysql2"); const dotenv = require("dotenv"); const morgan = require("morgan"); const session = require("express-session"); const MySQLStore = require("express-mysql-session")(session); const passport = require("passport"); const bodyParser = require("body-parser"); const cookieSession = require('cookie-session') const cors = require("cors"); dotenv.config({ path: path.join(__dirname, "/.env") }); const { sequelize } = require("./models"); const app = express(); const passportConfig = require("./passport"); passportConfig(); // 패스포트 설정 // 인증 라우터 const pageRouter = require("./routes/pages"); const authRouter = require("./routes/auth"); const mypageRouter = require("./routes/mypage"); const groupRouter = require("./routes/group"); const guestRouter = require("./routes/guest"); const randomRouter = require("./routes/random"); sequelize .sync({ force: false }) .then(() => { console.log("데이터베이스 연결"); }) .catch((err) => { console.error(err); }); const port = 3000; // VARIABLES app.set("trust proxy", 1); app.use( cors({ // front 서버인 127.0.0.1:8080 의 요청을 허용하도록 cors 사용 origin: [process.env.FRONT_URL_1, process.env.FRONT_URL_2], // origin: ['http://localhost:8080', 'http://localhost:8081'], methods: ["GET", "PUT", "POST", "PATCH", "DELETE", "OPTIONS"], optionsSuccessStatus: 200, credentials: true, }) ); app.use("/uploads", express.static("uploads")); app.use(morgan("dev")); // log app.use(express.static(path.join(__dirname, "public"))); // 요청시 기본 경로 설정 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(cookieParser(process.env.COOKIE_SECRET)); const options = { host: process.env.DB_HOST, port: process.env.DB_PORT, user: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, }; // Sequelize로 설정한 MySQL 연결 객체를 사용하여 MySQL 저장소 생성 const sessionStore = new MySQLStore(options, mysql.createConnection(options)); app.use(cookieSession({ maxAge : 1000 * 60 * 60 * 24 * 7, secret: process.env.COOKIE_SECRET, // 암호화 키 domain: [process.env.FRONT_URL_1, process.env.FRONT_URL_2], httpOnly: true, secure: true, sameSite: "none", })); // 쿠키 세션 미들웨어 등록 // regenerate & save 오류 현상 해결 app.use(function(req, res, next) { if (req.session && !req.session.regenerate) { req.session.regenerate = (cb) => { cb() } } if (req.session && !req.session.save) { req.session.save = (cb) => { cb() } } next() }) // app.use( // session({ // resave: false, // 세션 항상 저장할지 // saveUninitialized: true, // 세션 저장 전 Uninitialized 상태로 만들어 저장 // secret: process.env.COOKIE_SECRET, // 암호화 키 // store: sessionStore, // Sequelize로 설정한 MySQL 저장소를 사용 // // cookie: { // // domain: [process.env.FRONT_URL_1, process.env.FRONT_URL_2], // // httpOnly: true, // // secure: true, // // sameSite: "none", // // maxAge: 1000 * 60 * 60 * 24 * 7, // // }, // }) // ); app.use(passport.initialize()); //요청 (req 객체) 에 passport 설정 app.use(passport.session()); // req.session 객체에 passport 인증 완료 정보를 저장 // 경로 지정 app.use("/", pageRouter); app.use("/auth", authRouter); app.use("/mypage", mypageRouter); app.use("/group", groupRouter); app.use("/guest", guestRouter); app.use("/random", randomRouter); // 일부러 에러 발생시키기 TEST용 app.use((req, res, next) => { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); error.status = 404; next(error); }); app.use((err, req, res, next) => { // 404 오류인 경우 if (err.status === 404) { res.status(404).send("페이지를 찾을 수 없습니다."); } else { // 다른 오류일 경우 일반적인 오류 페이지 표시 res.status(500).send("서버 오류가 발생했습니다."); } }); // 에러 처리 미들웨어 app.use((err, req, res, next) => { // 템플릿 변수 설정 res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== "production" ? err : {}; // 배포용이 아니라면 err설정 아니면 빈 객체 res.status(err.status || 500); res.send({ error: { message: err.message, }, }); }); app.listen(port, () => { console.log(`http://localhost:${port}`); });auth.js 파일입니다(로그인 , 로그아웃)// 로그인 exports.login = async (req, res, next) => { //? local로 실행이 되면 localstrategy.js를 찾아 실행 console.log("로그인 실행"); passport.authenticate("local", (authError, user, info) => { console.log("로그인 패스포트"); console.log(authError, user, info); // done(err)가 처리된 경우 if (authError) { console.error(authError); return next(authError); // 에러처리 미들웨어로 보낸다. } if (!user) { return res.status(400).json({ message: "가입되지 않은 회원입니다." }); } console.log('유저',user); return req.login(user, (loginError) => { if (loginError) { console.error(loginError); return next(loginError); } // req.session.save(() => { const userData = JSON.parse(JSON.stringify(user)); delete userData.password; console.log('유저데이터', userData); res.json({ message: '로그인 성공', user: userData }); // }); }); })(req, res, next); // 미들웨어 내의 미들웨어에는 (req, res, next)를 붙입니다. }; //로그아웃 // exports.logout = (req, res) => { // req.logout(() => { // req.session.destroy(); // passport 업데이트 이후 함수 안에 넣어야 실행됨 // res.clearCookie("connect.sid"); // connect.sid 쿠키 삭제 // res.send("로그아웃"); // }); // }; exports.logout = (req, res) => { req.session = null; // 세션 삭제 res.clearCookie("connect.sid"); // connect.sid 쿠키 삭제 res.send("로그아웃"); };가비아에서 도메인을 사서 cloudflare로 연결했습니다프론트에는 'https://api.smile-mbti.shop/ '로 백엔드url를 연결했고백에는 'https://www.smile-mbti.shop', 'https://front.smile-mbti.shop'을 fronturl로 연결했습니다(쿠키, CORS 도메인)https://github.com/w00ye0l/SMilE깃허브 링크도 첨부합니다ㅜ
-
미해결파이썬 증권 데이터 수집과 분석으로 신호와 소음 찾기
dtype={"itemcode": np.object}) 을 dtype={"itemcode": object}) 으로 변경해야 하나요?
예전에 잘 들었다가 최근에 다시 들으면서 실행하니,numpy dtype관련사항이 변경(업데이트)가 있었는지 numpy 1.20이후 변경되었다고 알람,오류메세지가 발생합니다. np.object 부분에서 np. 을 빼고 실행하면 되는데 이렇게 진행하면 될까요? 본 섹션 이외에도 np.object를 string으로 입력받기 위해 사용된 곳이 몇몇 보이는데 해당부분도 동일하게 object(찾아보니 python default type 같습니다만, 정확히 알지 못하겠습니다.) 로 변경해서 사용하면 크게 문제가 없을까요? 시간이 지났지만 자세하고 하나씩 설명해 주셔서 감사합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
css질문
display:flex가 없어도 위치가 똑같은부분에 왜display:flex;flex-direction:column; or flex-direction:row를 왜 쓰는지모르겠어요 안써도 위치가같아보이는데필요성도 안느껴지고 언제언제쓰는지도 잘 모르겠습니다
-
미해결AWS 배포 완벽가이드 (feat. Lightsail, Docker, ECS)
SSH and deploy 과정에서 error
- name: SSH and deploy run: | ssh ${{secrets.SSH_USER_NAME}}@${{secrets.SSH_PUBLIC_IP}} " cd devops-practice git pull || exit 1 npm install || exit 1 npm run build || exit 1 sudo pkill node || exit 1 sudo npm run start & npx wait-on http://localhost exit" SSH and deploy 과정에서 exit 명령어가 실행되지 않고 무한 루프를 돌다가 cd가 실패하는 이슈가 발생합니다. ubuntu 18.04로 변경 ⇒ github action에서 18.04은 이제 지원하지 않는 것 같음GitHub Actions: The Ubuntu 18.04 Actions runner image is being deprecated and will be removed by 12/1/22env에 AWS_DEFAULT_REGION을 추가 ⇒ 여전히 에러 발생이슈해결을 위해 다음 방식을 찾아보았으나, 아직 해결하지 못하였습니다.어떤 부분이 문제일까요?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
hikariConfig 설정부분에서 에러가 납니다.
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 이부분에서 에러 내용이 Element 'bean' cannot contain text content. The content type is defined as element-only. 라고 나오는데 뭐가 문제일까요? pom.xml에서 <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.4.1</version></dependency>이렇게 설정했습니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
flush() 쓰기 지연 SQL 저장소 비우나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]비울 지.. 안 비울 지..전송해 버려서 가지고 있을 필요가 없는 것 같으면서도..그렇다고 그게 그렇게 큰 메모리는 차지하고 있지는 않을 거기 때문에..가지고 있는 이점이 뭔지는 모르겠지만, 뭔가 이점이 있어서 안 지울 것 같기도 하고..
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Category
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Category 에 parent와 child의 역할이 뭔지 수업을 듣고도 잘 모르겠습니다 단순히 부모카테고리 자식카테고리로 알고있으면 되는걸까요? 이렇게 만들면 연결된 items 하고도 부모카테고리와 자식카테고리가 어떻게 엮이는지 잘 이해가 안갑니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
V4 질문드립니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]등록할 땐 수량 9999 제한이 있고수정할 땐 없어야 하는데 등록할 때부터 가격123 수량12312312가 등록됩니다.가격 123123 수량 123123으로 설정하면 상품의 가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = -2,020,596,055 이런 식의 오류가 뜨구요.. 하라는대로 다 따라하고 pdf파일의 코드 복붙도 해보고 소스코드에 있는 프로젝트를 실행해봐도 결과는 다 똑같이 나오고있습니다 어느부분을 수정해야 정상작동되나요?
-
해결됨
섹션4. 프록시 패턴과 데코레이터 패턴 실행 질문 입니다.
안녕하세요 영한님질문을 검색했는데 나오지 않아 부득이하게 질문을 남겼습니다 ㅜㅜ 이미 있는 질문이라면 정말 죄송합니다. 다른질문들도 많은데 스프링고급편을 수강을 하고 있는데요섹션4. 프록시 패턴과 데코레이터 패턴인터페이스 기반 프록시 - 적용 편을 보고 질문드립니다. 해당 편을 실행을 시켜서 디버깅을 해보면OrderControllerV1 해당인터페이스를 사용하는게OrderControllerV1Impl implements OrderControllerV1OrderControllerInterfaceProxy implements OrderControllerV1두클래스인데 처음호출되는게 왜 OrderControllerInterfaceProxy 클래스인지 궁금해서 질문드립니다.여기에 나와있는 Import 에 InterfaceProcxyConfig.class 때문인가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 쓰기 지연 SQL 저장소
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]persist 하면 캐시에 저장됨과 동시에 그 내용이 SQL로 해석되어 쓰기 지연 SQL 저장소에 저장되잖아요.그런데 중간에 영속화 했던 것의 값을 바꾸면 updata문이 또 추가가 될거 잖아요. (커밋 시점에 비교하는 거니 한번만. 물론 보통 persist 전에 모든 작업을 끝내놓는게 바람직 하지만)그런 것 보다는 차라리 캐시 될 때 쓰기 지연 SQL 저장소에다 SQL문으로 해석하여 저장하는 것 보다,커밋 순간에 캐시에 있는 내용들을 SQL문으로 해석하는 것은 별로일까요?그러니까, member 객체를 select문에서 가져온거면 enum.select, 새로 생성한 거면 enum.create라고 해서 추가로 그렇게 묶어서,캐시에 저장할 때는 원래 member 객체 reference를 가지고 있도록 한 다음 객체 하나로 감싸서 저 enum을 가지고 있게 한다던지,(초기상태 캡쳐도 한다고 했는데, 그럼 원래 이런 식인건가..? Member prototype 해서..?)마지막에 commit 순간에 영속성 컨텍스트를 읽어 SQL문으로 해석하고 만약 enum.create면 그냥 최신값 그대로 쿼리문으로 만들어서 날리면 되고update면 현재값 그대로 날리면 되고select면 이거는 똑같고. 전체적으로 보니 그냥 이거 모두를 select 처럼 commit 시점에 한번 확인만 하고 영속성 컨텍스트에 있는 모두를 한번에 쿼리로 바꿔 내보내는 것이요. 근데 이거 아직 join 이런 게 잘 몰라서 그런 쪽에서 문제가 있을 수 있겠나요?
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
heartbeat에 관하여 질문이 있습니다.
강사님 heartbeat관련 문제를poll 사이즈를 늘려도 해결이 안되는데 보통 어떤 상황에 맞게 어떻게 설정하여 해결을 하나요?지금 전 aiokafka를 사용중입니다
-
미해결스프링 핵심 원리 - 기본편
@RequiredArgsConstructor 과 @Qualifier은 동시 사용이 되지 않는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]강의를 수강하다가 궁금한 것이 있어 질문드립니다.이전 롬복 강의에 이어 @Qualifier 사용 코딩하니 롬복과 @Qualifier 이 동시에 되지 않는 것으로 판단됩니다.같이 사용할 수 있는 방법은 없는 것인가요?@Qualifier 사용을 위해서는 @AutoWired로 생성자 주입을 해야하는 것인가요? 실무에서는 어떻게 하시는지 궁금합니다.
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
MyFileWriter 클래스 선언 질문
처음에 MyFileWriter 클래스를 null 로 선언하고 Try 문안에서 new 키워드를 사용한 이유는 무엇인지 궁금합니다 !!public static void main(String[] args){ MyFileWriter writer = new MyFileWriter(); try{ writer.write("아이스크림이 먹고 싶어요"); }catch (Exception e){ e.printStackTrace(); }finally { try { writer.close(); } catch (Exception e) { throw new RuntimeException(e); } }이런식으로 사용하는 것과 무슨 차이가 있는지 궁금합니다 !
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
string 문법 질문 드립니다.
Format을 사용할때, {:%>10}.format('nice'))위 코드에서 앞과 끝자리에 nice를 붙이지않고, 가운데에 붙일수있는 방법은 없을까요?프린트시 %%%nice%%% 이런식으로 출력될 수 있게끔요!
-
해결됨홍정모의 따라하며 배우는 C++
메모리 할당에 관하여
변수의 메모리 할당은 언제 이루어지는 건가요? 변수를 선언하면 쓰레기값으로 초기화되는 건가요? 이 경우 선언 즉시 메모리가 할당되는 게 맞는지도 궁금합니다.혹은 사용자가 선언 및 초기화 시에 메모리 할당이 이루어지는 걸까요?혹은 해당 변수에 무언가 대입되어야 메모리 할당이 이루어지는 건가요?
-
미해결
DD
DDDDDD
-
해결됨20년 경력자의 알기쉬운 컴퓨터네트워크
섹션 3의 1강 토폴로지 구성에서 질문 있습니다.
강사님 안녕하세요?수업이 너무 재밌습니다. 전공때 너무 지루해서 대충 넘어갔는데 강사님 설명을 듣다보니 네트워크 마스터가 되어가는 느낌입니다.본론으로 들어가서아래 토폴로지 구성에서 라우터와 서버를 크로스 오버 케이블로 연결하신 이유가 따로 있으신가요?Auto-MDIX 덕분에 다이렉트 케이블과 구분이 없이 사용 가능 하기 때문인가요??강의 내용에선크로스 오버 케이블 : OSI 7 Layer 기준 같은 계층의 장비다이렉트 케이블 : OSI 7 Layer 기준 다른 계층 장비라고 하셨는데 해당 토폴로지 구성에선 별 다른 설명 없이 크로스 오버 케이블 사용하셔서 혼란스럽습니다.
-
미해결데이터 분석 SQL Fundamentals
순위 함수 cume_dist, percent_rank 질문
실습에서 상품 매출 순위 상위 10%의 상품 및 매출액 구할때cume_dist함수 대신 percent_rank 사용해도 되나요?둘이 비슷해서 정확히 어떤 상황에서 두 함수를 구분하여 사용해야하는 지 감이 안 오네요..ㅠㅠ
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
75. 최대 수입 스케쥴 sort
sort(T.begin(), T.end());하는 이유가 궁금합니다. 정렬 안해도 if(T[j].when<i) break;에서 걸러질텐데 앞에서 소팅하는 이유가 있는건가요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
질문이 있습니다.
선생님의 flutter-lv2-server-main 파일은,만약 앱하나를 직접 만드는 개발자라면 이 파일도 직접 만들 줄 알아야 할까요?만든다면 어떻게 만들면 될까요?이것에 관한 수업은 없을까요?만약 이것에 관한 수업을 듣는다면, 어떤 영상을 찾아서 봐야할까요?직접 앱을 만들어서 공식 론칭을 하려고 할때, 이런 서버파일도 필요할텐데, 현재 이 수업에서는 그냥 선생님의 파일을 다운받아 스웨거 화면으로 넘어가고 있습니다. 이런 모든 과정에 대해 배우고 싶습니다.