최근 토이프로젝트들을 하다가
이제는 실제 프로젝트에 들어가기 전 웹 사이트와 관련된 토이 프로젝트들을 연습해보기로 마음을 먹었다.
그! 래! 서!
이번에는 실제 기능을 하는 로그인 화면을 구현해보려고 한다.
나는 백엔드에 대한 지식이 매~우 부족하지만, 정말 다행히도 express
를 이용해 서버와 응답하는 강의 영상을 올려두신 분이 계시더라
[Node.js] 백엔드 맛보기 | 로그인 인증 기능 만들기 in 서버 | 유저 데이터 만들기
다만 세션을 관리하거나 토큰을 보내는 등의 기술은 너무나도 백엔드 단이기 때문에
백엔드와 연동되는 부분은 POST
를 이용해서 아이디와 비밀번호를 보내고 , 응답을 보내주는 정도로만 하기로 했다.
그리고 사실 아직 쿠키와 세션에 대한 부분을 제대로 이해하지 못한 부분도 있다.
흑 .. 로컬 스토리지 이런 거 하던데 .. 그 부분에 대한 공부를 하고 나서 한 번 더 해봐야겠다
작업 | 설명 |
---|---|
HTML 폼 생성 | 사용자 입력을 수집하기 위한 HTML 폼을 생성합니다. 아이디와 비밀번호를 입력할 수 있는 필드가 포함됩니다. |
JavaScript 입력 처리 | 자바스크립트 코드를 작성하여 사용자로부터 폼에서 입력한 값을 가져옵니다. |
폼 유효성 검사 | 클라이언트 측에서 필수 입력 필드가 모두 채워졌는지와 입력 형식이 올바른지를 확인하는 폼 유효성 검사를 구현합니다. |
서버로 POST 요청 전송 | Fetch API나 다른 비동기 통신 방법을 사용하여 입력값을 서버로 전송합니다. |
서버 응답 처리 | 서버로부터 받은 응답을 처리하고, 응답이 성공이면 다음 페이지로 이동하거나 작업을 수행합니다. |
로그아웃 처리 | 로그아웃 버튼을 통해 로그아웃을 수행하고, 서버에 로그아웃 요청을 보냅니다. |
로그인 상태 유지 | 저장된 인증 토큰을 사용하여 로그인 상태를 유지하고, 페이지 이동 및 브라우저 종료 시에도 유지됩니다. |
에러 처리 및 메시지 표시 | 서버로부터 받은 에러를 처리하고, 사용자에게 메시지를 표시하여 문제를 안내합니다. |
보안 강화 | HTTPS를 사용하여 통신을 암호화하고, 사용자 입력값을 안전하게 처리하며, 보안적인 조치를 취합니다. |
갸아아악 가보자고
우선 HTML
을 이용해서 로그인 페이지와, 로그인 상태 페이지를 만들어야겠다.
HTML / CSS
또 어떤 디자인을 야무지게 할까 생각하다가
지금 디자인 이쁘게 꾸밀 때가 아닌 것 같아서 여러 레퍼런스를 찾아 돌아다녔다.
그러다가 그냥 가장 베이직한 로그인 인터페이스를 찾아서 살펴본 후 만들었다.
참고 깃허브 : https://github.com/nauvalazhar/bootstrap-4-login-page/tree/master
해당 인터페이스에다가 https://www.youtube.com/watch?v=hlwlM4a5rxg 를 참고하여 배경이미지를 이쁜 것으로 만들어주고
container
의background
,backdrop-filter
를 만져주었더니 퀄리티가 매우 올라갔다 !
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="icon">🔥</div>
<div class="container">
<h1 class="header">Login</h1>
<form action="" class="login-form">
<div class="form-group">
<label for="email">E-Mail Address</label>
<input id="email" name="email" type="email" />
</div>
<div class="form-group">
<label for="password"
>Password
<a href="">Forgot Password?</a>
</label>
<input id="password" name="password" type="password" />
</div>
<div class="custom-checkbox">
<input type="checkbox" name="remember" id="remember" />
<label for="remember">Remember me</label>
</div>
</form>
<button class="login-button">Login</button>
<div class="footer-text">
Don't have an account? <a href="">Create One</a>
</div>
</div>
</body>
</html>
@import url('https://fonts.googleapis.com/css2?family=Hahmlet:wght@300&family=Noto+Sans+KR&display=swap');
* {
font-family: 'Noto Sans KR', sans-serif;
}
body {
width: 100vw;
height: 100vh;
padding: 0px;
margin: 0px;
display: flex;
justify-content: center;
align-items: center;
background: url(background.jpg);
background-size: cover;
background-position: center;
}
div {
box-sizing: border-box;
}
.container {
width: 30vw;
margin: 0 auto;
padding: 5vw 5vh;
background-color: transparent;
box-shadow: 0px 0px 5px 5px rgba(225, 225, 255, 0.2);
border-radius: 20px;
backdrop-filter: blur(20px);
color: white;
position: relative;
font-weight: 900;
}
.login-form {
width: 100%;
margin-bottom: 5%;
}
label {
display: flex;
justify-content: space-between;
width: 100%;
}
a {
color: skyblue;
text-decoration: none;
}
#email,
#password {
width: 100%;
height: 40px;
margin: 3% 0;
}
#remember {
margin-right: 1%;
}
.custom-checkbox {
display: flex;
}
.login-button {
background-color: skyblue;
border: none;
color: white;
font-size: 24px;
width: 100%;
height: 80px;
}
.footer-text {
padding: 30px;
text-align: center;
}
@media screen and (max-width: 425px) {
.container {
width: 100vw;
height: 100vh;
background-color: transparent;
display: flex;
flex-direction: column;
justify-self: center;
position: relative;
padding-top: 40%;
margin: 0px;
}
}
이번에는 저번처럼 px
단위를 써서 정적이지 않도록 하려고 vw , vh , %
를 이용해서 스타일링 해봤다.
그리고 처음으로 MDN
에서 슥 보고 미디어 쿼리도 써봤는데 좋은 것 같다.
나름 모바일 환경에서의 로그인 창처럼 샥샥 만들기도 편하더라
디자인은 이렇게 끝 ~!
input
과 label
의 관계 , input
의 어트리뷰트들 <label for="email">E-Mail Address</label>
<input
id="email"
name="email"
type="email"
autocomplete="off"
required
/>
예전 html
을 공부 할 때 input
관련 부분에 대해서 깊게 공부한적 없었는데 이번에 만들면서 더 공부하게 됐다.
label
의 for
속성과 input
의 id
속성은 같은 값을 가져야 한다.
input
에 대응되는 label
을 만들어줌으로서 시각적으로 표현을 할 수 있으며,
웹 접근성 양상에서 도움이 된다.
화면 판독기 사용자들에게 해당
input
창이 어떤 의미인지를 말해줄 수 있으며label
창만 클릭해도 해당input
태그로 이동해준다.
input
의 name
어트리뷰트는 form
이 제출되었을 때 서버에 전달 될 값의 프로퍼티로 역할을 한다. 이는 자바스크립트 영역에서 더 알아봐야겠다.
background : transparent , backdrop-filter : blur
background:transparent
는 해당 태그의 배경색을 투명하게 만들어 부모 태그의 배경색이 보이도록 만든다.
backdrop-filter: blur();
는 해당 요소의 백그라운드를 흐린 효과로 만들어준다.
속성 값에는 blur
를 제외하고도 brightness, contrast, grayscale, hue-rotate, invert, opacity, saturate, sepia
등이 존재하며 혼합해서 쓸 수 있다.
한 번 해보자 !
원본 (blur(20px)
)
blur(20px) saturate(200%)
채도 조절
blur(20px) contrast(200%)
대비 조절
blur(20px) grayscale(0.5)
회색 톤 조절
blur(20px) opacity(0.5)
투명도 조절
blur(20px) invert(1)
색상 반전 (0 ~ 1 사이의 값)
blur(20px) hue-rotate(45deg)
색상휠 회전
hue-rotate
를 사용하면 추출된 색상 휠을 돌려버린다.
0 ~ 360deg
의 값을 갖는다.
신기하구만
그래도 나는 투명한 느낌이 좋아서blur
만 사용하도록 해야지 룰루루