심심한 개발자의 취미생활

security

Cookie 인증

개념

  • 인증에 필요한 정보를 Key-Value 형식의 Cookie에 담아 클라이언트에 저장하고 클라이언트는 매 요청마다 이 쿠키를 서버에 보내 인증을 유지하는 방식 서버는 정보를 별도로 저장하지 않으므로 무상태(Stateless) 구조를 가진다.

동작 방식

  1. 로그인 : 사용자가 ID/PW로 로그인을 요청한다.
  2. 쿠키 발급 : 서버는 사용자의 정보를 검증하고, 인증 정보를 담은 데이터를 생성하여 암호화한 뒤 쿠키에 담아 클라이언트에게 응답으로 보낸다.
  3. 쿠키 저장 : 클라이언트는 받은 쿠키를 브라우저에 저장한다.
  4. 인증 요청 : 클라이언트는 이후 모든 요청의 헤더에 이 쿠키를 포함하여 서버로 보낸다.
  5. 인증 확인 : 서버는 요청에 포함된 쿠키의 정보를 검증하여 유효한 사용자인지 확인하고 응답한다.

장단점

  • 장점

    • 서버의 무상태성 및 확장성
      • 서버가 사용자의 상태를 저장하지 않으므로, 서버의 수평적 확장에 매우 유리하다.
    • 유연성
      • 쿠키에 담긴 정보가 자체적으로 인증을 완료하므로, 다른 도메인이나 마이크로 서비스 환경에서도 유연하게 인증을 처리할 수 있다.
  • 단점

    • 보안 취약점
      • 쿠키는 클라이언트에 저장되므로 XSS 공격으로 탈취 될수 있고, CSRF 공격에 취약할 수 있다.
    • 쿠키 데이터 크기 제한
      • 쿠키에는 약 4KB의 용량 제한이 있어 많은 정보를 담기 어렵다.
    • 데이터 노출
      • 암호화 되더라도 사용자의 정보 일부가 클라이언트에 저장된다는 부담이 있다.

Session 인증

개념

  • 서버가 사용자의 인증 정보를 자신의 메모리나 DB와 같은 별도 저장소에 Session으로 저장하고, 클라이언트에게는 그 세션을 식별할 수 있는 고유한 ID만을 쿠키에 담아 보내는 방식이다. 서버가 상태를 저장하므로 상태 기반(Stateful) 구조를 가진다.

동작 방식

  1. 로그인
  2. 세션 생성 및 ID 발급 : 서버는 정보를 검증한 뒤, 해당 사용자의 정보를 서버의 세션 저장소에 저장하고 고유한 Session ID를 생성한다.
  3. 쿠키 (Session ID) 전송 : 서버는 생성된 Session ID를 쿠키에 담아 클라이언트에게 응답으로 보낸다.
  4. 쿠키 저장 : 클라이언트는 이 Session ID가 담긴 쿠키를 브라우저에 저장한다.
  5. 인증 요청 : 클라이언트는 이후 모든 요청에 Session ID가 담긴 쿠키를 함께 보낸다.
  6. 인증 확인 : 서버는 쿠키의 Session ID를 받아 세션 저장소에서 해당 ID와 매칭 되는 사용자 정보를 찾아 인증을 확인하고 응답을 한다.

장단점

  • 장점

    • 높은 보안
      • 인증의 핵심 정보가 모두 서버에 저장되고, 클라이언트는 식별자인 Session ID만 가지고 있으므로 쿠키 방식보다 안전하다.
    • 데이터 크기 제한 없음
      • 세션에 저장할 수 있는 데이터 양에 제한이 없다.
    • 세션 관리의 용이성
      • 서버에서 특정 사용자의 세션을 강제로 만료시키거나 접속을 끊는 등 통제가 용이다.
  • 단점

    • 서버 부하 및 비용
      • 서버가 모든 사용자의 세션 정보를 저장하고 관리해야 하므로 메모리나 저장 공간을 자치하며, 이는 서버 부하로 이어질 수 있다.
    • 확장성 문제
      • 서버가 여러대 일 경우, 특정 서버에 저장된 세션을 다른 서버가 공유할 수 었는 문제가 발생한다. 이를 해결하기 위해 Redis와 같은 세션 클러스터링 기술이 필요하다.

JWT

  • 인증 접로를 담는 하나의 형식(객체)라고 할수 있다. JWT는 JSON객체를 사용하여 두 당사자 간에 정보를 안전하게 전송하기 위한 컴팩트하고 독립적인 방법을 정의한 개방형 표준이다. 이 정보는 디지털 서명이 되어 있어 신뢰할 수 있다.

구조

  • JWT는 .을 구분자로 하여 세 부분으로 구성된다.
  1. Header (헤더)
    • 토큰의 타입과 서명에 사용할 해싱 알고리즘을 담고 있다.
  2. Payload (페이로드)
    • 사용자의 ID, 이름, 권한, 토큰 만료 시간 등의 정보가 담겨 있다.
  3. Signature (서명)
    • Header와 Payload를 인코딩한 값과 서버만 아는 비밀키를 사용하여 생성한다.
    • 이 서명은 토큰이 중간에 위변조 되지 않았음을 증명한다.

OAuth

  • OAuth는 제 3자 애플리케이션에세 리소스 소유자를 대신하여 리소스에 대한 접근 권한을 위임하는 과정을 정의한 프로토콜 이다.