로컬 스토리지, 세션 스토리지, 쿠키의 차이점을 알기 쉽게 페이지 및 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(); };
서버에서 직접 접근할 수 없으므로 직접 헤더에 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(); };
퍼블릭화한 S3 버킷의 객체 URL은 https://[버킷명].s3.[버킷리전].awazonaws.com/[객체]로 되어있다. ex) https://doromo-example.s3
2023-07-27Node.js와 express로 백엔드를 구축했다. 백엔드에서 aws-sdk를 이용하여 버킷과 객체에 접근할 것이다. MY_AWS_ACCESS_KEY : IAM 설정에서 발급받은
2023-07-27AWS S3의 모든 객체는 버킷에 저장되기 때문에 S3에 파일과 폴더를 업로드하려면, 먼저 객체가 저장될 버킷을 생성해야 한다. 또한 Node.js에서 @aws-sdk/client
2023-07-27Node.js는 @aws-sdk/client-s3 라이브러리를 이용하여 S3 버킷과 객체를 제어한다. 라이브러리를 사용하기 위해서는 일단 AWS S3에서 IAM 사용자를 만들어 액
2023-07-27# Contact : jyw966@naver.com
Copyright © doromo. All Rights Reserved.