Project.log

WebDevCurriculum / 인증의 이해 본문

ETC

WebDevCurriculum / 인증의 이해

jinuk_ 2023. 5. 9. 17:55
728x90
반응형

Knowre-Dev의 WebDevCurriculum의 레포지토리를 Fork하여 퀘스트를 해결해 나가는 글입니다.

Introduction

  • 이번 퀘스트에서는 웹에서의 인증에 관해 알아보겠습니다.

Checklist

  • 쿠키란 무엇일까요?

쿠키(cookie)란 인터넷 사용자가 어떤 웹사이트를 방문하면, 해당 웹사이트에서 사용자의 컴퓨터에 저장하는 작은 데이터 파일입니다. 쿠키는 일반적으로 사용자가 다시 웹사이트를 방문할 때 해당 사이트에서 사용자를 인식하고, 사용자의 개인 설정이나 로그인 정보 등을 유지하기 위해 사용됩니다.

 

쿠키는 사용자의 컴퓨터에서만 저장되며, 웹사이트에서는 해당 쿠키에 저장된 정보를 읽어들이고 활용할 있습니다. 쿠키는 사용자의 개인 정보를 수집하거나 유출할 없으며, 사용자가 수동으로 쿠키를 삭제하거나 브라우저 설정에서 쿠키를 차단하면 해당 웹사이트에서 쿠키를 사용할 없게 됩니다.

 

  • 쿠키는 어떤 식으로 동작하나요?

쿠키는 웹사이트와 사용자 컴퓨터 사이에서 정보를 주고 받습니다. 일반적으로 웹사이트에서는 사용자가 로그인 정보를 입력하거나 설정을 변경하면, 해당 정보를 쿠키에 저장합니다. 그리고 사용자가 다시 웹사이트를 방문할 때, 웹사이트는 저장된 쿠키를 읽어서 사용자의 이전 설정이나 로그인 상태 등을 파악합니다.

 

쿠키는 브라우저에 의해 관리되며, 쿠키를 저장할 때는 각 쿠키에 대한 이름, 값, 만료일 등의 정보가 포함됩니다. 쿠키에 저장된 정보는 일반적으로 텍스트 형식으로 저장되며, 사용자의 컴퓨터에 파일 형태로 저장됩니다.

 

쿠키는 일반적으로 세션 쿠키(Session Cookie)와 영속 쿠키(Persistent Cookie)로 구분됩니다. 세션 쿠키는 사용자가 웹사이트에 접속한 동안에만 유효하며, 브라우저가 종료되면 삭제됩니다. 반면, 영속 쿠키는 지정된 만료일이 지나기 전까지는 계속해서 유지됩니다.

 

쿠키는 웹사이트에서 사용자의 설정을 기억하거나 로그인 정보를 유지하기 위해 유용하게 사용됩니다. 

 

  • 쿠키는 어떤 식으로 서버와 클라이언트 사이에 정보를 주고받나요?

쿠키는 서버와 클라이언트 사이에서 HTTP 프로토콜을 이용하여 정보를 주고 받습니다. 

  1. 클라이언트(웹 브라우저)가 서버에 HTTP 요청을 보냅니다.
  2. 서버는 요청에 대한 응답으로 HTTP 헤더(Header)와 HTTP 본문(Body)을 전송합니다.
  3. HTTP 헤더 중 Set-Cookie 헤더를 사용하여 쿠키 정보를 클라이언트에 전송합니다. 쿠키 정보에는 쿠키 이름, 쿠키 값, 만료 날짜 등이 포함됩니다.
  4. 클라이언트는 서버로부터 전송된 쿠키 정보를 자신의 로컬 저장소에 저장합니다.
  5. 이후 클라이언트가 같은 서버에 HTTP 요청을 보낼 때마다, 클라이언트는 저장된 쿠키 정보를 HTTP 요청 헤더에 포함하여 서버로 전송합니다.
  6. 서버는 클라이언트로부터 전송된 쿠키 정보를 확인하고, 해당 정보에 따라 적절한 처리를 수행합니다.

위와 같은 방식으로 쿠키는 서버와 클라이언트 사이에서 정보를 주고받습니다. 이를 통해 웹사이트는 사용자의 설정을 기억하거나 로그인 정보를 유지할 있습니다.

 

  • 웹 어플리케이션의 세션이란 무엇일까요?

클라이언트와 서버 간에 일정 시간 동안 유지되는 상태 정보를 말합니다. 세션은 일반적으로 사용자 인증 정보나 웹사이트 상태 정보 등을 유지하기 위해 사용됩니다.

 

세션은 서버 측에서 관리되며, 클라이언트는 세션 ID(Session ID)를 통해 서버와 세션을 연결합니다. 세션 ID는 서버에서 생성되고, 클라이언트는 이를 쿠키나 URL 매개변수를 통해 전송받아 사용합니다.

 

웹 어플리케이션이 사용자 인증을 처리할 때, 사용자가 로그인을 하면 서버는 해당 사용자의 인증 정보를 세션에 저장합니다. 그리고 이후 사용자의 모든 요청은 해당 세션 ID를 통해 서버와 연결되며, 서버는 세션 ID를 통해 해당 사용자의 인증 정보를 확인하여 요청을 처리합니다.

 

세션은 일정 시간동안 유지되며, 세션 만료 시간은 일반적으로 서버 측에서 설정됩니다. 만료 시간이 지나면 서버는 해당 세션을 삭제하고, 클라이언트는 다시 새로운 세션 ID 생성하여 새로운 세션을 시작합니다.

 

  • 세션의 ID와 내용은 각각 어디에 저장되고 어떻게 서버와 교환되나요?

세션의 ID는 일반적으로 쿠키(Cookie)를 통해 클라이언트에 저장됩니다. 서버는 세션 ID를 클라이언트에게 전달하기 위해 Set-Cookie 헤더를 이용하여 쿠키를 생성하고, 이를 HTTP 응답(Response)에 포함시켜 클라이언트로 전송합니다.

 

클라이언트는 서버로부터 전송받은 쿠키를 HTTP 요청(Request)에 포함시켜 서버에 전달합니다. 이를 통해 서버는 클라이언트와 세션을 연결할 수 있습니다.

 

세션의 내용은 일반적으로 서버 측에 저장됩니다. 세션 데이터는 서버의 메모리에 저장되거나, 데이터베이스 등의 저장소에 저장될 수 있습니다. 세션 데이터는 클라이언트와 직접적으로 관련이 없으며, 클라이언트는 세션 ID만을 이용하여 서버에 접근할 수 있습니다.

 

세션의 내용은 세션 ID 통해 서버에 접근한 , 서버 측에서 관리 수정됩니다. 클라이언트는 세션 ID만을 이용하여 서버에 접근하고, 서버는 해당 세션 ID 연결된 세션 데이터를 이용하여 클라이언트 요청을 처리합니다. 따라서, 세션 데이터는 서버 측에서 관리되며, 클라이언트는 해당 세션 ID 이용하여 세션 데이터에 접근할 있습니다.

 

  • JWT란 무엇인가요?

JWT(JSON Web Token)는 웹 표준 기술인 JSON을 이용하여 토큰 기반 인증(Authentication)을 구현하기 위한 방법 중 하나입니다.

 

JWT는 세션(Session)과 같은 상태 정보를 서버에 저장하지 않고, 토큰(Token)을 이용하여 사용자 인증 정보를 전달하는 방식입니다. 토큰은 JSON 객체를 Base64 인코딩한 문자열로 구성되며, 헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분으로 이루어져 있습니다.

  • 헤더(Header): JWT 토큰의 타입과 사용하는 해시 알고리즘 정보가 담겨있습니다.
  • 페이로드(Payload): JWT 토큰에 담길 정보, 즉 클라이언트에서 서버로 전달할 사용자 인증 정보 등이 담겨있습니다.
  • 서명(Signature): JWT 토큰을 서명하는데 사용되는 비밀키를 이용하여 생성됩니다. 서명은 토큰이 변경되지 않았는지 검증하는 역할을 합니다.

JWT는 서버와 클라이언트 간의 인증 정보를 안전하게 전달하고, 클라이언트의 상태 정보를 서버에서 유지하지 않아도 되므로 확장성이 뛰어나다는 장점이 있습니다. 또한, 토큰을 이용하여 사용자 인증 정보를 검증하기 때문에, 서버에서 인증 정보를 직접 조회하는 것보다 빠르고 경제적입니다.

 

JWT 인증 정보를 전달하는 방식으로 널리 사용되며, 예를 들어 어플리케이션에서 사용자 로그인 발급받은 JWT 토큰을 이용하여 서버로 요청을 보낼 인증 정보를 전달할 있습니다.

 

  • JWT 토큰은 어디에 저장되고 어떻게 서버와 교환되나요?

JWT 토큰은 일반적으로 클라이언트 측에서 저장되며, 주로 브라우저의 웹 스토리지(LocalStorage, SessionStorage)나 쿠키(Cookie)에 저장됩니다.

 

사용자가 로그인하면, 서버는 JWT 토큰을 생성하여 클라이언트에게 전달합니다. 이후 클라이언트는 이 JWT 토큰을 로컬 저장소나 쿠키에 저장하고, 이를 이용하여 서버로 보내는 요청에 인증 정보를 첨부합니다. 이때, HTTP 요청의 Authorization 헤더 등을 이용하여 JWT 토큰을 함께 보내는 방식이 일반적입니다.

 

서버는 JWT 토큰을 검증하여 사용자 인증을 수행합니다. 이때 JWT 토큰의 유효성 검증은 서버에서 비밀키를 이용하여 서명을 검증하는 방식으로 이루어집니다. 만약 JWT 토큰의 서명이 검증되지 않거나, 유효기간이 만료된 경우 인증 실패로 처리됩니다.

 

  • 세션에 비해 JWT 가지는 장점은 무엇인가요? JWT 비해 세션이 가지는 장점은 무엇인가요?

JWT의 장점:

  • 서버에서 상태를 관리하지 않기 때문에, 서버의 확장성이 용이합니다.
  • 분산 시스템에서도 동작 가능하며, 다양한 클라이언트에서 사용 가능합니다.
  • 세션과 달리 서버에 저장할 필요가 없기 때문에 서버 자원을 아낄 수 있습니다.
  • 필요한 정보를 포함하고 있으므로 서버에서 따로 DB를 조회할 필요가 없어, 성능이 향상됩니다.
  • 세션의 경우 서버 장애시 세션 정보가 유실될 수 있으나, JWT의 경우 토큰 자체가 모든 정보를 가지고 있기 때문에 별도의 저장소가 필요하지 않습니다.

세션의 장점:

  • 서버에서 사용자 정보를 관리하기 때문에 보안성이 높습니다.
  • 세션 ID만 저장하면 되기 때문에, JWT보다 저장 공간을 적게 사용합니다.
  • JWT의 경우 토큰이 한 번 발급되면 만료 기간이 끝날 때까지 계속 유효하지만, 세션의 경우 브라우저 종료 등을 통해 자연스럽게 만료되기 때문에 보안성이 높아집니다.

따라서, JWT 상태를 저장하지 않는 REST API 같은 환경에서 유용하며, 세션은 사용자 인증과 같은 상태를 서버에서 관리해야 하는 경우에 유용합니다. 또한, JWT 토큰이 갈라지지 않도록 보안성을 높여야 하며, 세션은 적절한 세션 관리 기법을 통해 세션 하이재킹과 같은 공격으로부터 보호해야 합니다.

728x90
반응형