[CS] JWT + 쿠키,세션

말하는 감자·2025년 1월 24일

CS

목록 보기
19/33
post-thumbnail

인증/인가

인증(Authentication)

  • 유저가 실제 유저인지 인증하는 개념
  • 사용자의 신원을 검증하는 프로세스
  • ID, PW로 로그인하는 행위

인가(Authorization)

  • 인증 이후 프로세스로, 인증된 유저가 어떠한 자원에 접근할 수 있는지 확인하는 절차
  • 관리자는 관리자 페이지에 접근 가능

웹 어플리케이션 인증 방식

웹 어플리케이션 인증의 특수성

  • 일반적으로 서버 - 클라이언트 구조로 되어있다.
  • Http 프로토콜
    • 비연결성(Connectionless)
    • 무상태(Stateless)

Http의 비연결성과 무상태 특성으로 인하여, 사용자가 로그인을 통해 인증을 거쳐도, 이후 요청에 대해서는 인증된 상태를 유지할 수 없다. 서버는 사용자가 로그인을 했다는 정보를 저장하지 않기 때문에, 최초 로그인 이후 매 요청마다 반복적으로 ID,PW를 입력하여 페이지 접근 인가를 받아야 하는 것이다.

로그인을 한 번 하면 그 이후에 반복해서 로그인 하지 않아도 페이지에 접근이 가능하도록 하고 싶다

쿠키(Cookie) & 세션(Session)

쿠키(Cookie) & 세션(Session)

JWT(JSON Web Token)

쿠키와 세션은 웹 애플리케이션에서 사용자 인증과 상태 관리를 위해 오랫동안 사용된 기술이지만, 분산 시스템이나 클라우드 기반 애플리케이션에서의 한계를 극복하기 위해 등장

  • 인증에 필요한 정보들을 암호화시킨 토큰
  • JWT 토큰(Access Token)을 HTTP 헤더에 담아 서버가 클라이언트를 식별한다.

쿠키와 세션의 한계?

  • 세션 데이터는 서버에 저장되므로, 서버 측 메모리나 데이터베이스에 추가적인 부담을 발생시키며, 만약 여러 서버를 사용할 시 세션 데이터를 모든 서버에 동기화 해야하므로 이는 서버의 분산,확장,관리를 어렵게 만든다.

구조

Header + Payload + Signature

  • Header(헤더)

    • 토큰 타입(jwt), 해쉬 알고리즘(RSA, HS256)으로 구성되어 있다.
  • Payload(페이로드)

    • claim이 포함되는 영역으로, 토큰에 담을 정보를 갖고 있다.
      • claim: key-value 형식으로 이루어진 한 쌍의 정보로, 엔티티에 대한 속성(사용자 정보)을 설명
    • 클라이언트 고유 ID 값이나 유효 기간 등이 포함되는 영역
  • Signature(서명)

    • 인코딩된 Header와 Payload를 더한 뒤, secret key로 해싱해서 생성한다. 이 때, 해싱 방법은 Header에서 지정한 해쉬 알고리즘 방법으로 한다
    • Header와 Payload는 단순히 인코딩된 값(Base64)이어서 누구든 복호화가 가능하나, Signature는 서버 측에서 관리하는 Secret key가 있어야 복호화가 가능하다
    • 토큰의 위/변조 여부를 확인 가능

JWT 작동


클라이언트가 로그인 할 때 서버에서 발급받은 토큰을 사용하면, 서버는 시크릿 키를 이용하여 검증

Access Token

  • 사용자를 대신하여 보호된 리소스에 접근하는 데 사용되는 토큰
  • 일반적으로 수명이 짧다(몇분~몇시간). 만약 토큰이 탈취되더라도 짧은 만료 시간으이 악용될 시간을 제한시킴
  • HTTPS를 통해 전송

Refresh Token

  • Access 토큰이 만료되었을 때, 새로운 Access 토큰을 발급받기 위해 사용되는 토큰으로, 리프레시 토큰을 사용하면 사용자가 다시 로그인하지 않고 지속적인 세션을 유지할 수 있다.
  • 액세스 토큰보다 더 긴 유효기간을 갖는다.(몇일~몇주 이상)
  • 탈취 시에는 악용 가능성이 있으므로, 초기 통신 시에만 전송되며 클라이언트 측에서 안전하게 보관해야하며, 필요시 토큰을 무효화 할 수 있는 매커니즘을 준비해야 한다.

JWT 장점

  • 무상태성(Stateless)
    • JWT는 서버가 추가적인 사용자 정보를 저장할 필요가 없기 때문에 서버간 상태 공유 문제를 해결하며, 서버에 대한 부하를 낮춘다.
  • 클라이언트, 서버가 다른 도메인을 사용할 때도 사용 가능하다
    • ex) 카카오 OAuth2 로그인 시 JWT 토큰 사용

단점

  • 구현 복잡도 증가
  • JWT에 담는 내용이 커질수록 네트워크 비용 증가
  • 시크릿 키 유출 시 JWT 조작 가능
  • 페이로드 자체는 암호화되지 않기 때문에 민감한 정보는 담을 수 없으며, 근본적인 보안 문제를 해결하지는 못함
profile
주니어개발자(?)

0개의 댓글