원티드 프리온보딩 - 로그인 기능 구현하기 3 (내용)
원티드 프리온보딩 - 로그인 기능 구현하기 3강 내용
세션이란?
- 사용자의 로그인 이후 로그아웃 혹은 로그인 만료까지의 기간
- 연결 그 자체
신분증 같은 느낌(임시출입증)
세션 방식 로그인 :
- 사용자 로그인이 유효한 시간동안 서버에 세션 아이디를 기록해 두고 인증에 사용하는 방식
- 세버가 세션 아이디를 기록하는 방법
쿠키란?
- HTTP 쿠키는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각입니다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송합니다. 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용합니다. 이를 이용하면 사용자의 로그인 상태를 유지할 수 있습니다. 상태가 없는(statless) HTTP 프로토콜에서 상태 정보를 기억시켜주기 때문입니다.
- response headers에 담아서 전달
- 쿠키 세팅은 프론트 엔드에서 절대 건드리면 안 됨 (건드리면 위험한 쿠키가 됨)
쿠키의 목적
세션 관리 (Session management)
- 서버에 저장해야 할 로그인, 장바구니, 게임 스코어 등 정보 관리
개인화 (Personalization)
- 사용자 선호, 테마 등의 세팅
트래킹 (Tracking)
- 사용자 행동을 기록하고 분석하는 용도
쿠키 관련 정책 지정하기
1. SameSite :
- 크로스 사이트(Cross-site)로 전송하는 요청의 경우 쿠키 전송에 제한을 두도록 설정
정확하게 같은 origin(도메인)이 같은 하나의 인스턴스에서 실행
None:
- 가장 보안이 낮은 정책
- 항상 쿠키가 전송됨
Strinck:
- 가장 보수적인 정책
- 크로스 사이트 요청에는 항상 전송되지 않음
- Lax:
- 안전한 몇개의 도메인에 한해 cross site 허용
2. maxAge : 유효기간
3. Secure : HTTPS 프로토콜 상에서 암호화된 요청일 경우에만 전송됨
4. httpOnly : XSS 공격을 방지 하기 위한 정책, 읽고 쓰는 것이 불가능 (Get/Post)
Cors (Cross-origin Resource Sharing)
교차 출처 리소스 공유 정책
Cross-origin
프로토콜이 다른 경우: http https 도메인이 다른 경우: naver.com google.com 포트 번호가 다른 경우: Port 8000 Port 8001
Cors error message
1
Access to XMLHttpRequest at 'https://localhost:4000/api/rout/' from origin 'https://localhost:3000/' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
- 로컬 환경에서 CORS 및 보안 플래그 검증 해제하기
1. Cors 무시하도록 설정하기
1
2
3
# MacOS terminal
$ open -n -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir="/tmp/chrome_dev_test" --disable-web-security
1
2
3
# Windows PowerShell
$ "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir=%LOCALAPPDATA%\Google\chromeTemp -–allow-file-access-from-files
2. mkcert 라이브러리를 사용해서 로컬호스트를 https로 띄우기
세션방식 로그인 하기
headers에 credentials: 'include'
넣어서 요청보내고, 로그인/user 정보 받아오기
1
2
3
4
5
6
const loginResponse = await axios.post(`${BASE_URL}/auth/login`, args, {
headers: {
"Content-Type": "application/json",
credentials: "include" //
}
});
1. 세션이 유효한지 서버에 확인
실습에서 getCurrentUserInfo
함수
1-1. 세션이 유효하다면 세션 사용 (로그인 패스)
1-2. 세션이 유효하지 않다면 로그인 진행
사용자가 입력한 아이디와 pw를 보내 로그인을 하고, session id를 쿠키로 전달받기
세션과 JWT의 장단점
구분 | JWT | 세션 |
---|---|---|
장점 | 인프라 개발/장비값이 감소 (서버/백엔드 비용 감소) | 프론트엔드 인증 쉬워짐(cookie에 알아서 저장되고, 알아서 header에 넣어서 요청하기때문에) 보안상 약간의 향상 |
단점 | 프론트엔드 복잡도 높아짐 (구현해야하는 것이 더 많음) 보안상 세션보다 조금 더 위험 | 세션을 유지시켜야하기 때문에 인프라 비용 증가 (서버/백엔드 비용 대폭 증가) |
참고사이트 :
This post is licensed under CC BY 4.0 by the author.