HTTP
사용자 인증 Cookie, Session, JWT
foxlee
2020. 12. 30. 12:39
HTTP 프로토콜
- Connenctionless : 서버와 클라이언트의 연결이 유지되지 않고 클라이언트가 서버로 요청을 보내고 요청을 받은 서버에서 클라이언트로 응답을 보내고 연결을 끊음
- Stateless : 상태 정보를 유지 하지 않음
- 위와 같은 특징으로 사용자 인증에 대한 정보를 유지할 수 있는 방법이 필요하다.
Cookie
- 클라이언트(브라우저)에 저장되는 데이터(key-value) - 텍스트
- Set-Cookie: 서버 -> 클라이언트 쿠키 전달(응답으로)
- Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고 이후 HTTP 요청시 서버로 전달
- 쿠키는 모든 요청에 자동으로 정보가 포함됨
- 네트워크 트래픽 추가 야기, 최소한의 정보만 저장해야함
- 서버에 자동으로 추가하지 않고 웹 브라우저에 저장하려면 웹 스토리지 사용
- 종류
- 쿠키: 만료 날짜를 입력하여 해당 날짜까지 유지
- 세션 쿠키: 만료 날짜를 생락하면 브라우저가 종료될때까지만 유지
- 사용, 만료
- expires=날짜 정보 / max-age 3600s
- 쿠키의 도메인을 지정하면 서브도메인까지 쿠기 접근함
- Https 로 보안성 높이고, HttpOnly로 XSS 공격 방지 및 자바스크립트에서 접근 불가하게하고, SameSite로 요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키 전송하도로 설정
- 사용 예
- 브라우저에 사용자 인증에 대한 정보를 저장하는 건 위험하므로 보통 광고 정보 트래킹, 장바구니,언어, 자동로그인 설정 유뮤 등에 이용함
- 페이지 탐색, 보안영역 접속, 접속자의 지역, 언어 설정, 마케팅 관련 등의 정보등을 수집, 저장
Session = 세션 쿠키
- 세션 쿠키를 이용(브라우저 닫으면 사라짐) - 유저 id에 대응하는 세션 ID를 만들어 서버(보통 redis-인메모리 데이터베이스, 키-값 데이터 저장소)에 저장
- (인메모리 데이터베이스(In-Memory Cache) - I/O 성능을 위해 데이터를 메모리에 적재하는 데이터베이스)
- 클라이언트는 세션 ID를 쿠키에 저장하고 서버에 요청할때마다 쿠키에 있는 세션 ID 를 보냄
- 사용자가 많아지거나/동시 접속자가 많아지면 부하가 그대로 서버에 증가됨
JWT - Json Web Token
- 암호된 유저정보가 담긴 토큰이 쿠키, 헤더, 로컬스토리지 등에 저장함
- 암호화 알고리즘 정보와, 유저 고유 ID 등의 정보를 Secret key 를 통해 암호화하고 Secret key를 가지고 있는 서버에서 복호화하여 사용자 정보를 확인
- 이미 발급된 JWT 삭제가 불가능해서 Refresh JWT을 활용할 수 있음
- 확장성이 뛰어남(다른 인증시스템에 접근 가능)
- JWT는 세션쿠기 방식에 비해 길이가 길어서 요청이 많아지면 자원 낭비가 발생됨