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는 세션쿠기 방식에 비해 길이가 길어서 요청이 많아지면 자원 낭비가 발생됨