묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결3시간 만에 끝내는 Cursor 완벽 가이드
커스텀 챗 기능 없어졌나요?
버그나 그런거때문에 사용을 안하는 것 같아보이네요.. 다운그레이드해서 사용해야하려나요?
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
개발환경 구성 관련) PowerShell에서 npm 꼭 사용해야 하나요?
해결 방법으로 관리자 권한에서 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 명령을 할 경우 문제가 없는지 AI로 확인해 보았습니다. 아래와 같이 말해주는데, 그냥 터미날 이용해서 강의 진행해도 문제 없나요? Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 명령은 개발 환경(nvm, yarn, 허가되지 않은 스크립트 실행 등)을 설정할 때 흔히 사용되지만, 관리자 권한으로 실행할 때 발생할 수 있는 보안적, 시스템적 측면의 문제점은 다음과 같습니다.1. 로컬 악성 스크립트 실행 위험 (보안 취약점)RemoteSigned 정책의 핵심은 "내가 직접 만든(로컬) 스크립트는 서명 없이 실행 가능"하고, "인터넷에서 다운로드한 스크립트는 신뢰된 서명이 있어야 함"입니다.문제점: 만약 악성코드나 해커가 시스템에 침투하여 교묘하게 스크립트 파일을 생성했다면, 이 파일은 '로컬에서 생성된 것'으로 간주되어 아무런 제약 없이 실행됩니다.관리자 권한 결합 시: 일반 사용자 권한이라면 스크립트가 실행되어도 시스템 파일을 건드리기 어렵지만, 관리자 권한으로 실행 중인 파워셸에서 이 정책이 풀려 있으면 시스템 삭제, 레지스트리 변조, 백도어 설치 등이 매우 쉬워집니다.2. 권한 상승 공격(Privilege Escalation)의 발판해커는 종종 시스템에 침투한 후 더 높은 권한을 얻으려고 시도합니다.문제점: 실행 정책이 완화되어 있으면, 공격자가 시스템 내부에서 작성한 공격용 .ps1 스크립트를 관리자 권한으로 실행할 수 있는 통로를 열어주게 됩니다.위험성: 관리자 권한의 파워셸은 윈도우의 모든 방어 체계를 무력화할 수 있는 강력한 도구입니다.3. 'Remote' 판정의 모호성 (파일 차단 해제)RemoteSigned는 인터넷에서 받은 파일인지 여부를 파일의 'Zone.Identifier' (Alternate Data Stream) 정보를 보고 판단합니다.문제점: 압축을 풀거나 특정 방식으로 복사된 스크립트 파일은 '인터넷에서 다운로드했다'는 표식이 사라질 수 있습니다. 이 경우 시스템은 이를 '안전한 로컬 파일'로 오인하여 서명 확인 없이 실행해 버립니다.4. 영구적인 설정 변경의 위험-Scope CurrentUser는 현재 로그인한 사용자의 설정을 영구적으로 바꿉니다.문제점: 당장 특정 도구(nvm 등)를 설치하기 위해 설정을 바꿨다가, 설치가 끝난 후에도 계속 이 상태로 방치되는 경우가 많습니다. 이는 시간이 지나면서 시스템 전체의 보안 수준을 지속적으로 낮게 유지하는 결과를 초래합니다.5. 전사 보안 정책(GPO)과의 충돌회사나 조직 내에서 관리되는 PC의 경우:문제점: 그룹 정책(GPO)으로 금지된 설정을 강제로 변경하려고 시도할 경우, 설정이 적용되지 않거나 IT 관리 시스템에서 보안 위반 경고(Alert)가 발생하여 보안 팀의 조사를 받을 수 있습니다.안전하게 사용하는 권장 방법위의 위험을 최소화하면서 필요한 작업을 하려면 다음과 같은 방법을 권장합니다.일시적으로만 적용하기 (Bypass 사용)전체 시스템 설정을 바꾸지 않고, 해당 파워셸 창을 닫으면 원래대로 돌아가게 합니다.codePowershell# 특정 스크립트를 실행할 때만 정책 우회 powershell.exe -ExecutionPolicy Bypass -File .\myscript.ps1작업 완료 후 원복하기작업이 끝났다면 다시 가장 안전한 상태인 Restricted 또는 AllSigned로 돌려놓는 것이 좋습니다.codePowershellSet-ExecutionPolicy Restricted -Scope CurrentUser신뢰할 수 있는 파일만 차단 해제하기인터넷에서 받은 스크립트가 실행되지 않을 때는 전체 정책을 풀지 말고, 해당 파일만 신뢰한다고 표시하세요.codePowershellUnblock-File -Path "C:\path\to\script.ps1"결론적으로, 개발 편의를 위해 RemoteSigned를 쓰는 것이 일반적이긴 하지만, 관리자 권한으로 이 설정을 열어두는 것은 "서명되지 않은 외부 공격 도구에게 내 시스템의 마스터키를 넘겨줄 수 있는 통로"를 열어두는 것과 같습니다. 꼭 필요한 경우에만 잠시 사용하고 다시 잠그는 습관이 중요합니다.
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
17 강의는 강사님과 다른 결과나 나와서요
혹시 이렇게 진행해도 되는건지요? cat CLAUDE.md 명령어로 보면 아래와 같이 생성되었습니다.# CLAUDE.mdThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.## 언어 및 커뮤니케이션 규칙- 기본 응답 언어: 한국어- 코드 주석: 한국어로 작성- 커밋 메시지: 한국어로 작성- 문서화: 한국어로 작성- 변수명/함수명: 영어 (코드 표준 준수)
-
미해결한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
setAvatarImage(null) 부분 질문
선생님, 안녕하세요. 강의 잘 듣고 있습니다 🙂프로필 수정 기능구현하기 - 기능 강좌에서 useEffect(() => { if (profile && isOpen) { setNickname(profile.nickname); setBio(profile.bio); setAvatarImage(null); } }, [profile, isOpen]);setAvatarImage(null);setAvatarImage의 인수로 null 값으로 설정한 이유를 강의에서 말씀 주셨는데 설명을 들었는데도 아직 잘 이해가 안 돼서요 ㅠㅠ해당 부분에 대해 좀 더 부연설명 해주실 수 있나요? 감사합니다. 새해 복 많이 받으세요!
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
cursor ai 설치시 오류
cursor ai 설치를 하면서 중간에 open cursor from terminal 이것을 설치 하는 부분에서 설치가 되지 않습니다.그래서 그냥 패스 하고 설치를 했는데 어디에서 저걸 설치를 해야할까여?저게 설치가 되지 않아서 인지 강의에서 보이는 오픈 파일 중에서 CLAUDE.md 파일이 보이지 않습니다.
-
미해결타입스크립트로 배우는 리액트(React.js) : 기초부터 최신 기술까지 완벽하게
useState 자동생성 하실때 누른 키보드가 궁금합니다.
안녕하세요. 누르신 키보드가 어떤것인지 질문 드립니다. useSta까지 입력하시고 자동생성된 useStateSnippet를 선택을 하셔서const [first, setFirst] = useState 이게 자동으로 생성이 되는데생성이 되자마자 어떤 키보드를 누르셨는지[showNotification, setShowNotification]= useState(second) 로 변경이 되더라구요.. 어떤 것을 입력하셔서 변경이 됬는지 알 수 있을까요?
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
74 미션에서
이전에..claude-nextjs-starterkit, claude-code-mastery, claude-nextjs-starters 등등 여러개의 폴더를 생성 해서 next.js 를 설치 하고 진행 하는 영상이 있었는데요.74 미션에서 위의 첨부한 그림은 claude-nextjs-starters 인데..목소리는 claude-nextjs-starterkit 을 다운 받으라고 하고..도대체 뭐가 맞는 건가요?아니면..그냥 next.js 설치 해서 하면 되는건가요? 차라리..이게 더 편하겠는데..
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
72 메타프롬프트 활욘 PRD 생성(+MVP) 에서 질문
88. 서브에이전트 를 보니까..72 메타프롬프트 활욘 PRD 생성(+MVP) 에서 새롭게 시작 한다는 노션을 사용 하는 화면을 확인할 수 있었습니다.그 이전에서는 화면을 볼 수 없어서..88 까지 확인을 했는데요.궁금한게 72 영상을 보면 claude_nextjs_starters 라는 것을 복사 해서 새로운 폴더를 만들었는데요.claude_nextjs_starters 라는 것은 이전 챕터 MCP 에서만 하더라도 shadcnui 로 로그인 페이지 만들고 하던 것 아니었나요?그런데 여기에 노션 작업을 추가 하는 건가요?CLAUDE.md 를 참고사항으로 적는 걸 보면 68,69 mcp server 영상 에서의 claude_nextjs_starters 는 아닌 것 같은데.. 도대체 감을 못잡겠네..
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
72 메타프롬프트 활욘 PRD 생성(+MVP) 에서 질문
88. 서브에이전트 를 보니까..72 메타프롬프트 활욘 PRD 생성(+MVP) 에서 새롭게 시작 한다는 노션을 사용 하는 화면을 확인할 수 있었습니다.그 이전에서는 화면을 볼 수 없어서..88 까지 확인을 했는데요.궁금한게 72 영상을 보면 claude_nextjs_starters 라는 것을 복사 해서 새로운 폴더를 만들었는데요.claude_nextjs_starters 라는 것은 이전 챕터 MCP 에서만 하더라도 shadcnui 로 로그인 페이지 만들고 하던 것 아니었나요?그런데 여기에 노션 작업을 추가 하는 건가요?CLAUDE.md 를 참고사항으로 적는 걸 보면 68,69 mcp server 영상 에서의 claude_nextjs_starters 는 아닌 것 같은데.. 도대체 감을 못잡겠네..
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
8장 마지막 강의 시 오류
org.springframework.security.authorization.AuthorizationDeniedException: Access Denied product 관련해서 axios를 jwtAxios로 변경 완료 후 리스트 진입을 시도하려하면 위와 같이 서버 오류와 응답코드로는 403이 나타나고 있습니다. 여기서 의문은... todo쪽은 정상조회되고product쪽은 액세스토큰, 리프레시도 모두 정상인데 접근이 안되고 있습니다ㅜㅜ
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
cursor & claude code
여기서 엔터 누르면 될까요?
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
@agent-prd-generator
docs에 제공해 주신 prd-generator.md를 생성했고Claude를 실행했을 때 @prd를 하면 아래와 같이 나오는데요, agent-prd-generator는 어디에 나오나요?
-
해결됨한입 챌린지 7기 - React.js
Day 19 미션 안내 질문
Day 19 미션 안내에서 '요구사항 2'의 State 생성 요구사항 중 action.type이 INIT인 경우에는 어떤 액션을 구현 하면 될까요?
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
73. 서브에이전트 활용 PRD 생성 (+프롬프트 엔지니어링) prd-generator.md 파일 경로
73 session PRD-generator.md 파일을 어디서 확인할 수 있는건거야? 제공해주신다고 했는데, 수업자료에는 없어서요.
-
해결됨누구보다 빠르게 배우는 Springboot + React RestAPI 게시판 만들기
강의자료문의
react ui 만들기 강의에서 헤더의파일같은거는 강의자료에 있다고 하셨는데 강의자료는 어디에 있나요?? 노션에도 없던데
-
해결됨한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
props 질문
TodoItem 에서 todo값을 props로 넘겨줄때 왜 {...todo} 로 사용하나요? {todo} 는 안되는건가요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
로그인시 401 Unauthorized 오류가 뜹니다
로그인시 401 Unauthorized 오류가 떠서리덕스 액션을 봤더니 LOG_IN_FAILURE에 error 내용이 비어 있었습니다.routes/user.jsconst express = require("express"); const bcrypt = require("bcrypt"); const { User, Post } = require("../models"); const passport = require("passport"); const router = express.Router(); router.post("/login", (req, res, next) => { console.log("🧾 req.body:", req.body); passport.authenticate("local", (err, user, info) => { if (err) { console.error(err); return next(err); } if (info) { return res.status(401).send(info.reason); } return req.login(user, async (loginerr) => { if (loginerr) { console.error(loginerr); return next(loginerr); } const fullUserWithoutPassword = await User.findOne({ where: { id: user.id }, attributes: { exclude: ["password"], }, include: [ { model: Post, }, { model: User, as: "Followings", }, { model: User, as: "Followers", }, ], }); return res.status(200).json(fullUserWithoutPassword); }); })(req, res, next); }); router.post("/", async (req, res, next) => { try { const exUser = await User.findOne({ where: { email: req.body.email, }, }); if (exUser) { return res.status(403).send("이미 사용중인 아이디입니다."); } const hashedPassword = await bcrypt.hash(req.body.password, 12); await User.create({ email: req.body.email, nickname: req.body.nickname, password: hashedPassword, }); res.status(201).send("ok"); } catch (error) { console.error(error); next(error); } }); module.exports = router; 세션 쿠키가 잘 전달이 안된건가 싶어서 req.body를 서버 터미널로 찍었더니 req.body: undefined 로 나왔습니다.로그인 폼에서 데이터를 잘못 넘겨준건가 해서 확인해봤더니 loginForm.js const onSubmitForm = useCallback(() => { console.log(email, password); dispatch(loginRequestAction({ email, password })); }, [email, password]);데이터도 잘 넘겨준 것 같고sagas/user.jsfunction logInAPI(data) { return axios.post("/user/login", data); } function* logIn(action) { try { const result = yield call(logInAPI, action.data); yield put({ type: LOG_IN_SUCCESS, data: result.data, }); } catch (err) { console.error(err); yield put({ type: LOG_IN_FAILURE, error: err.response.data, }); } }사가쪽도 문제가 없어보여서 프론트 쪽 문제는 아닌 것 같고 백엔드쪽 문제 같은데 도저히 어디서 문제가 생긴건지 모르겠습니다.app.jsconst express = require("express"); const cors = require("cors"); const session = require("express-session"); const cookieParser = require("cookie-parser"); const postRouter = require("./routes/post"); const userRouter = require("./routes/user"); const db = require("./models"); const passportConfig = require("./passport"); const passport = require("passport"); const dotenv = require("dotenv"); dotenv.config(); const app = express(); db.sequelize .sync() .then(() => { console.log("db 연결성공"); }) .catch(console.error); passportConfig(); app.use( cors({ origin: "*", credentials: false, }) ); 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, }) ); app.use(passport.initialize()); app.use(passport.session()); app.get("/", (req, res) => { res.send("hello express"); }); app.get("/api", (req, res) => { res.json([ { id: 1, content: "hello", }, { id: 2, content: "hello2", }, { id: 3, content: "hello3", }, ]); }); app.get("/api/posts", (req, res) => { res.json([ { id: 1, content: "hello", }, { id: 2, content: "hello2", }, { id: 3, content: "hello3", }, ]); }); app.use("/post", postRouter); app.use("/user", userRouter); app.listen(3065, () => { console.log("서버 실행 중!"); }); passport/local.jsconst passport = require("passport"); const { Strategy: LocalStrategy } = require("passport-local"); const { User } = require("../models"); const bcrypt = require("bcrypt"); module.exports = () => { passport.use( new LocalStrategy( { usernameField: "email", passwordField: "password", }, async (email, password, done) => { try { console.log("입력값:", email, password); const user = await User.findOne({ where: { email }, }); console.log("찾은 유저:", user && user.email); if (!user) { return done(null, false, { reason: "존재하지 않는 이메일입니다!" }); } const result = await bcrypt.compare(password, user.password); if (result) { return done(null, user); } return done(null, false, { reason: "비밀번호가 틀렸습니다." }); } catch (error) { console.log(error); return done(error); } } ) ); }; passport/index.jsconst passport = require("passport"); const local = require("./local"); const { User } = require("../models"); module.exports = () => { passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser(async (id, done) => { try { const user = await User.findOne({ where: { id } }); done(null, user); } catch (error) { console.error(error); done(error); } }); local(); }; 백엔드 코드를 첨부하였습니다.터미널에 나온 콘솔 내용입니다.local.js파일에서도 콘솔("입력값:","찾은 유저:" )을 찍었는데 터미널에 찍힌 콘솔은 req.body만 찍혔습니다..
-
해결됨한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
부모에서 훅 호출하여 자식에게 prop으로 내려주기 vs 자식에서 훅 호출 선생님은 어떻게 생각하시는지 궁금합니다
map 함수 안에서 자식 컴포넌트가 순회하는 코드가 있다고 할 때, 그 자식 컴포넌트 안에서 훅(ex useEditPost/useDeletePost)을 호출하는 것이 좋을까요? 아니면 부모에서 훅을 한번 호출한 뒤 자식 컴포넌트에 prop으로 내려주는 것이 좋을까요? 전자는 자식마다 호출되어 할당될 것 같아서 메모리 관리에 단점이 있을 것 같고 (추측입니다), 후자는 (훅의 함수를 받아야하는 대상 컴포넌트가 자식 내부에 더 깊은 뎁스에 있다고 할 때) Prop Drilling의 단점이 있을 것 같은데요선생님은 어떻게 생각하시나요?
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
/init 와 CLAUDE.md 파일 한글화에 대해 질문
안녕하세요.강의 잘 듣고 있습니다.두가지 질문이 있어서요프로젝트 진행중에 새로운 기능이나 변경 사항이 있을때마다 /init를 해주면 좋은가요?(토큰 사용량과는 상관없이)CLAUDE.md 파일 내용은 원래 영어로 되어 있는건에 이번 강의에서 보니깐 한글로 요청해서 하시던데, 클코가 프로젝트를 이해하고 수행하는데 영어와는 차이가 없을까요? (역시 토큰 사용량과 상관없이, 한글 사용해도 클코가 잘 이해하고 잘 따르는지 궁금합니다.)
-
미해결Next.js 까보기: "쓸 줄 아는 개발자"에서 "알고 쓰는 개발자"로
Link 컴포넌트는 그러면 웬만하면 무조건 쓰는편이 좋은가요?
예를들어 landing 페이지에서 특정 페이지를 prefetching하는데 가져오는 그 페이지내에서 사용되는 데이터가많거나 할경우 prefetch가 독이되는 경우가 있을까요?아니면 웬만하면 무조건 쓰는게 맞을까요?