Skip to content

Latest commit

 

History

History
 
 

Quest10

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Quest 10. 인증의 이해

Introduction

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

Topics

  • Cookie
  • Session
  • JWT

Resources

Checklist

  • 쿠키란 무엇일까요?
 - 쿠키는 웹 사이트에서 클라이언트에게 전송되어 저장되는 작은 데이터 조각입니다. 쿠키는 일반적으로 클라이언트의 브라우저에 저장되며, 클라이언트가 웹 사이트를 다시 방문할 때마다 서버가 클라이언트의 브라우저로부터 이 쿠키를 검색합니다.

 - 쿠키는 일반적으로 로그인 정보, 사용자의 기본 설정, 장바구니 상태 등과 같은 사용자와 관련된 정보를 저장하는 데 사용됩니다. 

 - 쿠키는 기본적으로 클라이언트 측에서 관리되므로 서버는 클라이언트 측에서 쿠키를 수정, 삭제 또는 읽을 수 없습니다.

  • 쿠키는 어떤 식으로 동작하나요?
1. 클라이언트가 웹 사이트에 접속하면, 서버는 클라이언트에게 쿠키를 설정하도록 요청합니다.

2. 서버는 Set-Cookie 헤더를 사용하여 클라이언트에게 쿠키를 전송합니다. 이 헤더에는 쿠키 이름, 값, 만료 날짜 및 경로와 같은 다양한 설정이 포함될 수 있습니다.

3. 클라이언트는 이 쿠키를 저장하고, 웹 사이트를 방문할 때마다 쿠키를 서버에 전송합니다. 이를 위해 Cookie 헤더를 사용합니다.

4. 서버는 쿠키를 확인하고, 해당 쿠키에 대한 작업을 수행합니다. 예를 들어, 로그인 정보를 저장하는 쿠키를 사용하여 로그인된 사용자의 세션을 유지할 수 있습니다.

5. 만료 날짜가 설정된 쿠키는 해당 날짜 이후에는 더 이상 유효하지 않으며, 클라이언트는 이 쿠키를 삭제합니다.

6. 클라이언트는 브라우저 설정에서 쿠키를 수동으로 삭제할 수 있습니다.

  • 쿠키는 어떤 식으로 서버와 클라이언트 사이에 정보를 주고받나요?
쿠키는 서버와 클라이언트 사이에서 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의 경우 토큰이 한 번 발급되면 만료 기간이 끝날 때까지 계속 유효하지만, 세션의 경우 브라우저 종료 등을 통해 자연스럽게 만료되기 때문에 보안성이 높아집니다.

Quest

  • 이번에는 메모장 시스템에 로그인 기능을 넣고자 합니다.
    • 사용자는 딱 세 명만 존재한다고 가정하고, 아이디와 비밀번호, 사용자의 닉네임은 하드코딩해도 무방합니다.
    • 로그인했을 때 해당 사용자가 이전에 작업했던 탭들과 마지막으로 활성화된 탭 등의 상태가 로딩 되어야 합니다.
    • 세션을 이용한 버전과, JWT를 이용한 버전 두 가지를 만들어 보세요!
      • 세션을 이용할 경우 세션은 서버의 메모리나 파일에 저장하면 됩니다.

Advanced

  • Web Authentication API(WebAuthn)은 무엇인가요?