[react-auth-example] 2. 프론트엔드

Project
2023-08-08

프론트엔드 깃허브 링크

로컬 스토리지, 세션 스토리지, 쿠키의 차이점을 알기 쉽게 페이지 및 API를 따로 구현했다.

API 요청 - 로그인

웹 스토리지

type LoginResponse = { id: string; token: string; }; export const login = async (id: string, password: string): Promise<LoginResponse> => { var myHeaders = new Headers(); myHeaders.append('Content-Type', 'application/json'); const user = { id, password }; return await ( await fetch('http://localhost:4000/auth/login', { method: 'POST', body: JSON.stringify(user), headers: myHeaders, }) ).json(); };
type LoginResponse = { id: string; token: string; }; export const login = async (id: string, password: string): Promise<LoginResponse> => { var myHeaders = new Headers(); myHeaders.append('Content-Type', 'application/json'); const user = { id, password }; return await ( await fetch('http://localhost:4000/auth/login', { method: 'POST', body: JSON.stringify(user), headers: myHeaders, }) ).json(); };

쿠키

프론트엔드에서 fetch 요청 시 옵션으로 credentials: "include"를 하고, 백엔드에서 cors 설정 및 res.cookie의 옵션으로 sameSite: "strict"를 해야 서버에서 브라우저에 다이렉트로 쿠키를 저장시킬 수 있다. (주의: 서버와 클라이언트의 도메인이 다르면 크로스 사이트 에러가 발생한다.)

type LoginResponse = { id: string; token: string; }; export const cookieLogin = async (id: string, password: string): Promise<LoginResponse> => { var myHeaders = new Headers(); myHeaders.append('Content-Type', 'application/json'); const user = { id, password }; return await ( await fetch('http://localhost:4000/auth/login?cookie=true', { method: 'POST', body: JSON.stringify(user), headers: myHeaders, credentials: 'include', }) ).json(); };
type LoginResponse = { id: string; token: string; }; export const cookieLogin = async (id: string, password: string): Promise<LoginResponse> => { var myHeaders = new Headers(); myHeaders.append('Content-Type', 'application/json'); const user = { id, password }; return await ( await fetch('http://localhost:4000/auth/login?cookie=true', { method: 'POST', body: JSON.stringify(user), headers: myHeaders, credentials: 'include', }) ).json(); };

API 요청 - 보호된 페이지 접근

웹스토리지

서버에서 직접 접근할 수 없으므로 직접 헤더에 Autorization: Bearer ${token}의 형태로 추가한다.

type verifyResponse = { authenticated: boolean; message: string; }; export const verifyWithLocalStorage = async (): Promise<verifyResponse> => { const token = localStorage.getItem('token'); if (!token) return { authenticated: false, message: '토큰이 없습니다.' }; var myHeaders = new Headers(); myHeaders.append('Authorization', `Bearer ${token}`); return await ( await fetch('http://localhost:4000/dashboard', { method: 'GET', headers: myHeaders, credentials: 'include', }) ).json(); };
type verifyResponse = { authenticated: boolean; message: string; }; export const verifyWithLocalStorage = async (): Promise<verifyResponse> => { const token = localStorage.getItem('token'); if (!token) return { authenticated: false, message: '토큰이 없습니다.' }; var myHeaders = new Headers(); myHeaders.append('Authorization', `Bearer ${token}`); return await ( await fetch('http://localhost:4000/dashboard', { method: 'GET', headers: myHeaders, credentials: 'include', }) ).json(); };
type verifyResponse = { authenticated: boolean; message: string; }; export const verifyWithSessionStorage = async (): Promise<verifyResponse> => { const token = sessionStorage.getItem('token'); if (!token) return { authenticated: false, message: '토큰이 없습니다.' }; var myHeaders = new Headers(); myHeaders.append('Authorization', `Bearer ${token}`); return await ( await fetch('http://localhost:4000/dashboard', { method: 'GET', headers: myHeaders, credentials: 'include', }) ).json(); };
type verifyResponse = { authenticated: boolean; message: string; }; export const verifyWithSessionStorage = async (): Promise<verifyResponse> => { const token = sessionStorage.getItem('token'); if (!token) return { authenticated: false, message: '토큰이 없습니다.' }; var myHeaders = new Headers(); myHeaders.append('Authorization', `Bearer ${token}`); return await ( await fetch('http://localhost:4000/dashboard', { method: 'GET', headers: myHeaders, credentials: 'include', }) ).json(); };

쿠키

쿠키는 request시 자동으로 header에 포함되기 때문에 따로 설정하지 않아도 된다.

type verifyResponse = { authenticated: boolean; message: string; }; export const verifyWithCookie = async (): Promise<verifyResponse> => { var myHeaders = new Headers(); myHeaders.append('Content-Type', 'application/json'); return await ( await fetch('http://localhost:4000/dashboard?cookie=true', { method: 'GET', headers: myHeaders, credentials: 'include', }) ).json(); };
type verifyResponse = { authenticated: boolean; message: string; }; export const verifyWithCookie = async (): Promise<verifyResponse> => { var myHeaders = new Headers(); myHeaders.append('Content-Type', 'application/json'); return await ( await fetch('http://localhost:4000/dashboard?cookie=true', { method: 'GET', headers: myHeaders, credentials: 'include', }) ).json(); };

관련 포스트

post thumbnail

[s3-example] 4. S3 이미지 불러오기

퍼블릭화한 S3 버킷의 객체 URL은 https://[버킷명].s3.[버킷리전].awazonaws.com/[객체]로 되어있다. ex) https://doromo-example.s3

2023-07-27
post thumbnail

[s3-example] 3. 백엔드 구축

Node.js와 express로 백엔드를 구축했다. 백엔드에서 aws-sdk를 이용하여 버킷과 객체에 접근할 것이다. MY_AWS_ACCESS_KEY : IAM 설정에서 발급받은

2023-07-27
post thumbnail

[s3-example] 2. 버킷 생성 및 권한 설정

AWS S3의 모든 객체는 버킷에 저장되기 때문에 S3에 파일과 폴더를 업로드하려면, 먼저 객체가 저장될 버킷을 생성해야 한다. 또한 Node.js에서 @aws-sdk/client

2023-07-27
post thumbnail

[s3-example] 1. IAM 설정

Node.js는 @aws-sdk/client-s3 라이브러리를 이용하여 S3 버킷과 객체를 제어한다. 라이브러리를 사용하기 위해서는 일단 AWS S3에서 IAM 사용자를 만들어 액

2023-07-27

도로모의 기술 블로그

# Contact : jyw966@naver.com

Copyright © doromo. All Rights Reserved.