Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[김창민]week6 #475

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

changmin6362
Copy link
Collaborator

@changmin6362 changmin6362 commented Feb 4, 2024

요구사항

기본

  • [x]
  • []- 로그인, 회원가입 페이지에서 필요한 api 요청을 보냅니다.
  • React와 같은 UI 라이브러리를 사용하지 않고 진행합니다.
  • []

심화

  • []- 로그인/회원가입시 성공 응답으로 받은 accessToken을 로컬 스토리지에 저장합니다.
  • []로그인/회원가입 페이지에 접근시 로컬 스토리지에 accessToken이 있는 경우 “/folder” 페이지로 이동합니다.
  • []

주요 변경사항

스크린샷

image

멘토에게

-어찌저찌 코드를 작성하긴 했지만 제가 만든 코드가 제대로 동작하는지 확인하는 방법을 잘 몰라서 헤맸습니다.
페이지가 넘어가긴 하는데, request가 제대로 전해졌는지를 모르겠습니다. 크롬 개발자 콘솔에서 request, response 메시지를 해석하는 방법이 궁금합니다.

https://bootcamp-api.codeit.kr/docs
그리고 위의 링크가 api 사용법을 안내해주는 것 같은데 어떻게 사용해야 하는지 모르겠습니다.

-심화 요구사항이 무슨 말인지 잘 모르겠습니다.
"로그인/회원가입 페이지 접근 시"라는게 화면에 회원가입 페이지에서 로그인 페이지로 넘어갈 때를 이야기하는 건가요?
지정된 아이디로 로그인을 할 때, 토큰을 생성하고, 토큰이 존재할 때만 페이지가 넘어가도록 코드를 짰는데, 문제에서 요구하는 게 이게 아닌 것 같습니다. 하지만 이것 말고는 다른 모델이 떠오르지 않아서 고치질 못했습니다.

@changmin6362 changmin6362 changed the title [김창민] [김창민]week6 Feb 4, 2024
@changmin6362 changmin6362 self-assigned this Feb 4, 2024
@changmin6362 changmin6362 added 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성 죄송합니다.. labels Feb 4, 2024
@YunKukPark
Copy link
Collaborator

YunKukPark commented Feb 5, 2024

어찌저찌 코드를 작성하긴 했지만 제가 만든 코드가 제대로 동작하는지 확인하는 방법을 잘 몰라서 헤맸습니다.
페이지가 넘어가긴 하는데, request가 제대로 전해졌는지를 모르겠습니다. 크롬 개발자 콘솔에서 request, response 메시지를 해석하는 방법이 궁금합니다.

request, response메세지를 해석하는 패널은 console 패널보다 Network 패널을 확인하시면 더 좋을 것 같아요!
네트워크패널 사용 방법 을 한번 확인해보시구 Payload 라는 탭에 request 가 담겨있고, Response 탭에서 response를 확인하실 수 있습니다

그리고 위의 링크가 api 사용법을 안내해주는 것 같은데 어떻게 사용해야 하는지 모르겠습니다.
아래 링크를 확인하면 좋을 것 같습니다!

https://flykimjiwon.tistory.com/116

"로그인/회원가입 페이지 접근 시"라는게 화면에 회원가입 페이지에서 로그인 페이지로 넘어갈 때를 이야기하는 건가요?
지정된 아이디로 로그인을 할 때, 토큰을 생성하고, 토큰이 존재할 때만 페이지가 넘어가도록 코드를 짰는데, 문제에서 요구하는 게 이게 아닌 것 같습니다. 하지만 이것 말고는 다른 모델이 떠오르지 않아서 고치질 못했습니다.

오.. 아주아주 좋은 고민을 하셨군요! 👍🏻
두 가지 접근 방식의 장단점을 한번 살펴보고, 이와 관련해서 방법들을 제안드리도록 하겠습니다.

1. 링크 클릭 시 이벤트 핸들러 사용

이 방법은 사용자가 링크를 클릭할 때 바로 accessToken을 확인하여 조건에 따라 페이지 이동을 결정하는 방식입니다.

이 방법의 단점은, 말씀하신 것처럼 모든 링크에 대해 이벤트 핸들러를 등록해야 하고, 조건에 따라 기본 동작을 방지한 후 적절한 액션을 취해야 한다는 점입니다.

하지만 어떠한 장점이 있느냐면, 페이지에 접근 조차 할 수 없게끔 완벽하게 막을 수 있기 때문에, 이벤트페이지나, 사용자(트래픽)가 많이 몰릴 것 같은 페이지에는 안전장치를 위해 링크 클릭 시 이벤트 핸들러에서 검증 이후에 페이지로 이동할 수 있게 안내해줍니다

또한, 이 방법을 통해 사용자가 권한이 없는 페이지에 접근하는 것을 완벽하게 막을 수 있다는 점은 중요한 보안적 이점을 제공합니다. 이는 특히 이벤트 페이지나 특정 사용자 그룹만을 대상으로 하는 콘텐츠에 매우 유용할 수 있습니다. 사용자 경험을 개선하고, 서버 측 로드를 줄이며, 보안을 강화하는 방법으로서의 장점을 가져가지요.

쓰다보니 길어졌지만, 특정 상황이 아니라면 1번 방식으로 접근하지 않아요

2. 페이지에 접근 후 확인

이 방법은 사용자가 회원가입/로그인 페이지에 접근한 후, 페이지 로드 시점에 accessToken을 확인하고 필요한 경우 페이지를 리다이렉트하는 방식이지요.

페이지 로드 시간 동안 사용자가 잠깐 진입 페이지를 볼 수 있으나, 구현이 상대적으로 간단하고 모든 링크에 대해 개별적인 처리를 할 필요가 없습니다.
페이지 로드 시 바로 체크하므로, 사용자가 불필요한 페이지에 머무는 시간을 최소화할 수 있습니다.

하지만, 아주 잠깐은 해당 페이지에 진입을 할 수 있으므로, 보안이 중요한 페이지라면 이 방식을 사용하는건 바람직 하지 않을 것 같습니다. (보안이 중요한 페이지는 1번 방식과 2번 방식 모두 사용합니다)

제안하는 방법

2번 방식을 제안 드려요! 추가로 무언가를 조금 더 놓고 가자면
이제 이번주 부터 React에 들어가면서 조금 뒤에 React Router를 배우게 될 건데요!

import React from 'react';
import { Route, Routes, Navigate, useNavigate } from 'react-router-dom';

const PrivateRoute = ({ children }) => {
  const isAuthenticated = /* 로직을 통해 accessToken 존재 여부 확인 */;
  return isAuthenticated ? children : <Navigate to="/login" replace />;
};

// 사용 예시
<Routes>
  <Route path="/" element={<PrivateRoute><HomePage /></PrivateRoute>} />
  <Route path="/login" element={<LoginPage />} />
</Routes>

위와 같은 방식으로 private router를 만들어 관리하는게 일반적인 방법이고 제안하는 방법입니다!

Copy link
Collaborator

@YunKukPark YunKukPark left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 창민님!
7주차에도 화이팅입니다!

conflict resolve만 부탁드리겠습니다!! 🖖🏻

.gitignore Show resolved Hide resolved
Comment on lines +6 to +7
elements.input.className += ` ${SIGN_INPUT_ERROR_CLASSNAME}`;
elements.errorMessage.className += ` ${ERROR_MESSAGE_CLASSNAME}`;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💬 how about

Suggested change
elements.input.className += ` ${SIGN_INPUT_ERROR_CLASSNAME}`;
elements.errorMessage.className += ` ${ERROR_MESSAGE_CLASSNAME}`;
elements.input.classList.add(SIGN_INPUT_ERROR_CLASSNAME);
elements.errorMessage.classList.add(ERROR_MESSAGE_CLASSNAME)


if (isTestUser) {
try {
const response = await fetch("https://bootcai.codeit.kr/api/sign-in", {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

음.. url이 잘못되어서 뭔가 에러가 뜰 것 같아요
url 체크 한번 부탁드리겠습니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

url이 어떻게 잘못된건가요? 잘 모르겠네요 ㅠㅠ

landing/src/signin.js Show resolved Hide resolved

const signForm = document.querySelector("#form");
signForm.addEventListener("submit", submitForm);
function submitForm(event) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

submitForm 함수 내에서 validateEmailInput 함수를 동기적으로 호출하고 있습니다.
validateEmailInput 함수는 비동기 함수이므로, await 키워드를 사용하여 비동기 호출을 기다려야 합니다. 현재 구현에서는 validateEmailInput의 결과가 항상 Promise 객체이므로, submitForm 함수도 비동기 함수로 변경하고 await를 사용해야 합니다.

아마 정상적으로 동작하지 않거나 동작했더라도 버그가 일어날 가능성이 매우 높은 함수일 것 같아요

async function submitForm(event) {
  event.preventDefault();

  const isEmailInputValid = await validateEmailInput(emailInput.value);
  const isPasswordInputValid = validatePasswordInput(passwordInput.value);
  const isConfirmPasswordInputValid = validateConfirmPasswordInput(confirmPasswordInput.value);

  if (isEmailInputValid && isPasswordInputValid && isConfirmPasswordInputValid) {
    location.href = "/folder";
  }
}

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전반적으로, 기능적인 측면에서 코드는 잘 구현되어 있으나, 비동기 처리와 관련된 몇 가지 주의사항과 개선이 필요해보이군요!!

처음으로 해보는 비동기일텐데..너무 고생 많으셨습니다.

비동기가 처음에 접근할 때 얼마나 헷갈리는 개념인지 공감도 됩니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성 죄송합니다..
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants