Published on

로그아웃 시 PATCH 방식과 DELETE 방식의 비교

Authors
  • avatar
    Name
    Hyo814
    Twitter

로그아웃 시 PATCH 방식과 DELETE 방식의 비교

로그아웃 시 PATCH 방식과 DELETE 방식의 비교

사용자가 로그아웃할 때 서버로 요청을 보내는 방법은 크게 두 가지로 나눌 수 있습니다: PATCH 방식DELETE 방식. 두 방식 모두 RESTful API에서 자주 사용되며, 각각의 장단점이 있습니다. 이 글에서는 로그아웃을 구현할 때 이 두 가지 방법을 비교하고, 어떤 상황에서 각각의 방식이 적합한지 살펴보겠습니다.


1. PATCH 방식으로 로그아웃

PATCH 메서드는 자원의 일부분을 수정할 때 사용됩니다. 로그아웃을 처리할 때는 사용자의 상태를 '로그아웃'으로 변경하는 방식으로 구현할 수 있습니다. 즉, 서버에 사용자의 상태를 '활성'에서 '비활성' 혹은 '로그인'에서 '로그아웃'으로 업데이트하는 요청을 보내는 것입니다.

PATCH 방식의 예시

// 클라이언트에서 로그아웃 요청 (PATCH)
const logout = async () => {
  const response = await fetch('/api/logout', {
    method: 'PATCH',
    headers: {
      Authorization: `Bearer ${token}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ status: 'logged_out' }),
  })

  if (response.ok) {
    localStorage.removeItem('authToken')
    console.log('로그아웃 성공')
  } else {
    console.error('로그아웃 실패')
  }
}

PATCH 방식의 특징

  • 부분 업데이트: PATCH는 자원의 일부분을 수정하는 데 사용됩니다. 즉, 사용자의 로그인 상태만 변경하고, 다른 데이터는 그대로 유지합니다.
  • 유연한 상태 관리: 로그아웃뿐만 아니라 사용자 상태를 '활성', '휴면', '블랙아웃' 등의 여러 상태로 관리할 때 유리합니다.
  • 데이터 유지: 세션이나 사용자 정보를 완전히 삭제하는 것이 아니라, 상태만 변경하는 경우 적합합니다. 예를 들어, 로그아웃 후에도 사용자의 세션 데이터를 보존하거나 이후에 다시 활성화할 필요가 있을 때 유용합니다.

PATCH 방식의 장점

  1. 부분적인 상태 업데이트: 자원의 일부만 수정하기 때문에, 전체 자원을 교체할 필요가 없어 효율적입니다.
  2. 상태 전환에 유리: 사용자가 로그아웃하는 상태 전환을 유연하게 처리할 수 있습니다. 사용자의 상태가 여러 가지로 변화할 때도 유용합니다.
  3. 다양한 시나리오에 적합: 예를 들어, 사용자가 블랙아웃, 비활성화 등 다양한 상태로 전환될 때 PATCH 방식이 더 직관적이고 관리하기 쉽습니다.

PATCH 방식의 단점

  • 자원 제거가 아님: PATCH는 자원의 상태를 변경하는 것이지, 자원을 삭제하는 것이 아닙니다. 따라서 사용자가 로그아웃 후에도 서버에 세션이나 인증 정보가 남아 있을 수 있습니다. 이로 인해 자원 낭비나 보안 위험이 있을 수 있습니다.

2. DELETE 방식으로 로그아웃

DELETE 메서드는 자원을 삭제할 때 사용됩니다. 로그아웃을 처리할 때는 사용자의 세션이나 인증 토큰을 삭제하는 방식으로 로그아웃을 구현할 수 있습니다. 즉, 로그아웃 요청을 보내면 서버에서 사용자의 세션이나 토큰이 삭제되어, 더 이상 인증된 요청을 할 수 없게 됩니다.

DELETE 방식의 예시

// 클라이언트에서 로그아웃 요청 (DELETE)
const logout = async () => {
  const response = await fetch('/api/logout', {
    method: 'DELETE',
    headers: {
      Authorization: `Bearer ${token}`,
    },
  })

  if (response.ok) {
    localStorage.removeItem('authToken')
    console.log('로그아웃 성공')
  } else {
    console.error('로그아웃 실패')
  }
}

DELETE 방식의 특징

  • 자원 삭제: DELETE는 자원을 완전히 삭제합니다. 즉, 사용자의 세션이나 인증 토큰을 서버에서 삭제하여, 사용자가 로그아웃되면 더 이상 그 자원에 접근할 수 없습니다.
  • 보안에 유리: 토큰 기반 인증에서 로그아웃 시 토큰을 삭제하거나 무효화하면, 추가적인 보안 강화를 할 수 있습니다.
  • 클린업 처리: 세션이나 인증 토큰을 삭제함으로써, 불필요한 데이터를 서버에 남기지 않고 깔끔하게 정리할 수 있습니다.

DELETE 방식의 장점

  1. 자원 제거: 세션이나 인증 정보를 완전히 삭제하여, 로그아웃 후 서버 자원에 대한 접근을 차단할 수 있습니다.
  2. 보안 강화: 사용자가 로그아웃한 후에는 더 이상 세션이 남아 있지 않기 때문에, 인증 관련 보안 위험을 최소화할 수 있습니다.
  3. 자원 관리 최적화: 사용자가 로그아웃할 때 서버에서 세션이나 토큰을 삭제하여 불필요한 자원 낭비를 방지할 수 있습니다.

DELETE 방식의 단점

  • 부분 업데이트가 불가: 자원을 삭제하는 것이므로, 세션 상태를 유지해야 하는 경우나 로그아웃 이후에도 데이터를 남겨두고 싶을 때는 부적합합니다.
  • 데이터 복구 어려움: 세션이나 데이터를 삭제한 후, 다시 로그인을 시도할 때 데이터 복구가 어렵습니다.

3. PATCH vs DELETE 비교

특징PATCH 방식DELETE 방식
사용 목적자원의 일부를 수정 (상태 전환)자원 전체를 삭제 (세션, 토큰 삭제)
상태 관리다양한 상태로 유연하게 전환 가능자원 삭제로 인해 상태 변경보다는 종료 처리
보안성자원을 유지하므로, 일부 세션 데이터가 남을 수 있음세션을 삭제하여, 더 이상 자원 접근 불가
자원 관리상태만 변경하므로 자원이 남을 수 있음세션과 인증 정보를 삭제하여 자원을 효율적으로 관리
적합한 상황로그아웃 상태를 기록하거나 유연하게 처리할 때세션, 인증 정보를 완전히 삭제하여 로그아웃 처리할 때