카테고리 없음

2024. 6. 17. (월) 슈퍼코딩 부트캠프 신입연수원 Day 13 (중간보고)

태영9922 2024. 6. 17. 19:06
  • TO-DO LIST : 오늘의 할 일 작성
  • 배운 내용 요약 정리

 


1. 시간 계산

const calcTime = (timestamp) => { //DB에 입력된 Date객체 값 가져와서
  const curTime = new Date().getTime() - 9 * 60 * 60 * 1000; //UTC+9 보정 9시간*60분*60초*1000밀리세컨드
  const time = new Date(curTime - timestamp); //현재시각에서 데이터 입력 당시 시각 빼기
  const hour = time.getHours(); //데이터 삽입시 부터 흐른 시
  const min = time.getMinutes(); //       "      흐른 분
  const sec = time.getSeconds(); //       "      흐른 초

  if (hour > 0) return `${hour}시간 전`;
  else if (min > 0) return `${min}분 전`;
  else if (sec >= 0) return `${sec}초 전`;
  else return `방금 전`;
};

 

2. 이미지 가져오기

//JavaScript
const res = await fetch(`/images/${obj.id}`); //서버에 obj.id를 기준으로 fetch(GET) 요청
const blob = await res.blob(); //return 값을 blob 타입으로 저장 후
const url = URL.createObjectURL(blob); //blob 타입에 대한 url 생성
img.src = url; //img url 지정

 

#Python
from fastapi import Response

@app.get("/images/{item_id}")
async def get_image(item_id):
    cur = con.cursor()  # DB에 접근하기 위해 커서 객체 생성
    imgae_bytes = cur.execute(
        f"""
                              SELECT image FROM items WHERE id={item_id}
                              """  # 요청한 아이디와 맞는 이미지 값 가져오기
    ).fetchone()[0]  # 한번 호출할때 하나의 row만 가져와서 [0]은 첫번째 column의 값 가져오기
    return Response(content=bytes.fromhex(imgae_bytes))

 

3. 배열 sort 할때 정렬 순서 지정하는 방법

//기본사용법
const numbers = [4, 2, 5, 1, 3];
numbers.sort(); // 기본적으로는 [1, 2, 3, 4, 5]와 같이 정렬됩니다.
numbers.sort((a, b) => a - b); // [1, 2, 3, 4, 5]// 정수 배열을 오름차순으로 정렬하는 예제
numbers.sort((a, b) => b - a); // [5, 4, 3, 2, 1]// 정수 배열을 내림차순으로 정렬하는 예제

-----------------------------------------------------
data.sort((a, b) => b.insertAt - a.insertAt).forEach(async (obj) => {....}
//나중에 들어온 시간 값이 기준점으로부터 더 많이 흐른 값이기 때문에 값이 더 큼. 그래서 최신순으로 정렬하도록 내림차순 정렬함

4. 숫자를 세자리 단위로 콤마(,) 찍는 방법

숫자.toLocaleString("ko-KR") //한국 기준

1. 유저 인증 관련 기초

- 프론트엔드에서 서버로 데이터를 보내는데 해시를 통해 암호화하기

- 받아온 정보를 백엔드에서 DB에 저장하고 저장된 정보를 바탕으로 로그인하기// 어떻게 알려줄까? 상태코드

- 로그인 유지시키기(서버의 stateless 이해하기) // 세션 vs JWT(JSON Web Token)

- 브라우저가 닫혀도 로그인을 유지시키는 방법 // 로컬 스토리지 vs 세션 스토리지

- 유저에 따라 다른 화면 보여주기. 로그인 했을때만 게시글을 쓰거나 수정 등을 할 수 있도록 구현하기

 

2. 회원가입 흐름

1) 프론트 -> 백엔드 : 회원가입요청
2) 백엔드 : DB에 회원정보 저장
3) 백엔드 : Access Token(JWT) 발급
4) 백엔드 -> 프론트 : 응답 +Access Token
5) 프론트 -> 백엔드 : 데이터 요청 + Access Token
6) 백엔드 : Access Token 검증
7) 백엔드 -> 프론트 : 응답 + 요청 데이터

 

3. 회원가입 페이지 구현

<form action="/signup" method="POST"> //서버에 아이디와 패스워드를 등록해달라는 요청을 보내는 POST
      <div>
        <label for="id">아이디</label>
        <input type="text" id="id" name="id" />
      </div>
      <div>
        <label for="password">패스워드</label>
        <input type="password" id="password" name="password" />
      </div>
      <div>
        <button type="submit">제출하기</button>
      </div>
    </form>

 

 

4. 보안과 암호화

- https://coding.tools/sha256 : 해시 암호화 -> 일방향 암호화라서 복호화 불가능.

 

5. 암호화 해서 주고 받는 방식 구현

const formData = new FormData(form); //입력 form에서 받아온 내용을 FormData객체로 받아옴
const sha256Password = sha256(formData.get("password")); //받아온 password를 sha256함수를 이용 해시암호화
formData.set("password", sha256Password); //formData에 있는 패스워드를 암호화된 패스워드로 다시 값 설정

  if (checkPassword()) { //비밀번호와 비밀번호 확인이 동일한지 체크하는 함수
    const res = await fetch("/signup", {
      method: "POST",
      body: formData,
    });
# 회원가입
@app.post("/signup")
def signup(id: Annotated[str, Form()], password: Annotated[str, Form()]):
    print(id, password)
    return "200"
#간단하게 받아온 데이터가 암호화 되는지 print로 확인만 구현

 

#슈퍼코딩, #1:1관리형부트캠프, #백엔드, #backend, #백엔드공부, #개발공부, #백엔드개발자 #취준일기, #취준기록, #취뽀, #빡공, #HTML/CSS, #javascript, #react , #java, #spring