bookId데이터를 input으로 서버액션에 보냈을 때 단점
129
작성한 질문수 2
bookId데이터를 hidden input으로 서버액션에 보내는 방식은 유저가 클라이언트 단에서 개발자 도구로 input의 value를 수정하여 데이터를 조작할 수 있는 가능성이 있어보이는데, 이런 경우까지 고려하면 어떤 방법이 더 안정적인 방법일까요?
답변 3
1
@정호성
백엔드 서버 측에서도 2중으로 권한 검증을 진행하되 아래와 같이 bind를 사용해서 createReviewAction.bind(null, bookId) 형태로 보내게 되면 데이터 조작을 방지하여 보안을 좀 더 강화할 수 있습니다.
// ReviewEditor.tsx
const ReviewEditor = ({ bookId }: ReviewFormProps) => {
return (
<section>
<form action={createReviewAction.bind(null, bookId)}>
<input required name="content" type="text" placeholder="리뷰 내용" />
<input required name="author" type="text" placeholder="작성자" />
<button type="submit">리뷰 작성</button>
</form>
</section>
);
};
// createReviewAction.ts
export const createReviewAction = async (bookId: number, formData: FormData) => {
const content = formData.get("content")?.toString();
const author = formData.get("author")?.toString();
if (!bookId || !content || !author) {
return;
}
return;
await createReview({ bookId, content, author });
};
1
안녕하세요 이정환입니다.
예리하시군요 👀 요런 엣지 케이스 때문에 보통은 백엔드 서버 측에서도 2중으로 권한 검증을 진행합니다. 만약 별도의 백엔드 서버 검증 로직 없이 기능을 구현해야 한다면 서버 액션 내부에 권한 검증 로직을 설정해 주어야 합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
정호성님, 서버 액션을 통해 클라이언트에서 데이터를 전송할 때 hidden input의 value를 조작할 수 있다는 점은 보안 측면에서 우려될 수 있습니다. 데이터 조작을 방지할 수 있는 몇 가지 방법을 소개할게요.
1. 서버측 검증 강화
서버에서 데이터를 수신할 때, 모든 요청 데이터의 유효성 검증을 철저히 해야 합니다. 클라이언트 측에서 데이터가 조작될 수 있다는 점을 항상 염두에 두고, 서버에서 데이터가 신뢰할 수 있는지 확인하십시오.
2. 인증 및 인가
사용자가 적절한 권한을 가지고 있는지 확인하는 과정을 추가하십시오. JWT 토큰이나 세션을 활용하여 사용자 인증 상태를 검증하는 것이 좋습니다.
3. 데이터 검증 및 리다이렉션
데이터의 무결성을 검증할 수 있도록 서버에서 데이터베이스의 상태와 비교하여 무결성을 확인하고, 차이가 있을 경우 적절한 리다이렉션 또는 에러 메시지를 사용자에게 보여줍니다.
4. 서버 액션 개선 방법
서버 액션에서 처리할 때는 사용자로부터 온 모든 데이터를 신뢰하지 말고, 데이터베이스의 상태나 서버에서 권한 검사로 확실하게 검증한 후 처리하는 것이 안전합니다. 필요하다면 CLUE 같은 보안 강화를 위해 추가적인 미들웨어를 사용할 수 있습니다.
관련하여 더 구체적으로 다루고 있는 기존 답변을 확인하시기 위해 유사한 질문이 등록된 기존 게시물도 함께 살펴보세요.
백엔드 서버가 존재할 때에도 서버 액션을 사용하는 것이 바람직할까요?
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
Next.js 사전렌더링 이해하기 부분
0
18
1
모달 관련 질문
0
30
3
렌더링 관련 질문
0
76
2
중복으로 하나의 api를 요청할 때 캐싱 옵션 통일화
0
59
2
라우트 세그먼트 옵션 강좌 노트에 사소한 제보 남깁니다.
0
60
2
SSR시 context에 params말고 query를 사용하면 안되나요?
0
73
2
npx prisma db push 시 에러가 뜹니다.
0
91
3
vercel 배포를 실패하였습니다.
0
93
3
Image 컴포넌트 사용시 브라우저 콘솔에 경고는 왜 뜨는걸까요?
0
54
2
getServerSideProps 함수와 SSR의 관계
0
76
6
없는 페이지인데 풀라우트캐시로 저장이 되는 이유가 궁금합니다
0
58
2
실제 프로젝트에서 SSR 사용에 관해서 질문드립니다.
0
112
2
일반적인 nextjs project architecture에 대하여..
0
83
2
2.14 Search에서 작성한건 static이긴하지만 CSR이 아닌가요?
0
71
2
배포 시 오류 발생
0
83
2
백엔드 서버 오류납니다.
0
79
2
취약점 제거시 nestjs 버전 문제가 생길까요?
0
89
1
eslint.config.mjs 내 rules 어떻게 설정 하나요?
0
102
1
[book]/[id]/page.tsx 모달 띄울 때 성능 하락 현상은 ReviewList를 불러오면서 발생하는 문제 같습니다.
0
60
2
빨간줄 설정
0
74
2
익스텐션 질문
0
58
1
강의 들으면서 궁금한 부분 질문드립니다.
0
108
1
서버 배포 에러입니다.
1
97
2
[5.2) 풀라우트 캐시 2] fetch의 cache 옵션 기본값 질문: no-store/force-cache
1
102
2





