[TIL 62일차] 인증과 인가, 비연결성, 무상태

이건·2024년 8월 20일

인증과 인가

  1. 인증 (Authentication): 사용자의 신원을 확인하는 과정이다. 사용자가 주장하는 신원이 실제로 그 사용자인지를 확인하기 위해 사용자 이름과 비밀번호, 생체 인식, OTP(일회용 비밀번호) 등을 사용한다.

  2. 인가 (Authorization): 인증된 사용자가 특정 자원이나 시스템에 접근할 수 있는 권한을 부여하는 과정이다. 즉, 인증을 통해 사용자의 신원이 확인된 후, 해당 사용자가 어떤 작업을 수행할 수 있는지를 결정한다.

간단히 말해, 인증은 "당신은 누구인가?"에 대한 질문이고, 인가는 "당신이 무엇을 할 수 있는가?"에 대한 질문이다. 이 두 과정은 보안 시스템에서 함께 작동하여 데이터와 시스템을 보호한다.

비연결성

비연결성(Connectionless)은 네트워크 통신에서 데이터 전송 방식 중 하나로, 송신자와 수신자 간에 고정된 연결을 유지하지 않고 데이터를 전송하는 방식을 의미한다. 이 방식은 다음과 같은 특징이 있다.

  1. 연결 설정 없음: 데이터 전송 전에 송신자와 수신자 간의 연결을 설정할 필요가 없다. 각 데이터 패킷은 독립적으로 전송된다.

  2. 패킷 기반 전송: 데이터는 패킷 단위로 전송되며, 각 패킷은 독립적으로 처리된다. 따라서 패킷이 수신 순서와 관계없이 도착할 수 있다.

  3. 오버헤드 감소: 연결을 설정하고 유지하는 데 필요한 리소스가 없으므로, 오버헤드가 줄어들어 빠른 데이터 전송이 가능하다.

  4. 신뢰성 부족: 비연결성 방식은 패킷 손실이나 중복, 순서 변경 등의 문제가 발생할 수 있으며, 이를 처리하기 위한 추가적인 메커니즘이 필요하다.

대표적인 비연결성 프로토콜로는 UDP(User Datagram Protocol)가 있다. UDP는 빠른 전송 속도를 제공하지만, 신뢰성 있는 데이터 전송이 필요한 경우에는 TCP(Transmission Control Protocol)와 같은 연결 지향 프로토콜을 사용하는 것이 일반적이다.

무상태(Stateless)

무상태(Stateless)는 네트워크 통신 및 애플리케이션 설계에서 중요한 개념으로, 클라이언트와 서버 간의 상호작용에서 서버가 클라이언트의 상태 정보를 저장하지 않는 방식을 의미한다. 이 방식의 주요 특징은 다음과 같다.

  1. 상태 정보 저장 없음: 각 요청은 독립적이며, 서버는 이전 요청과의 관계 없이 각 요청을 처리한다. 클라이언트의 상태나 이전 상호작용에 대한 정보를 기억하지 않는다.

  2. 서버의 간결함: 서버가 클라이언트의 상태를 관리하지 않기 때문에, 서버의 구현이 간단해지고 확장성이 높아진다. 여러 서버에 부하를 분산시키기 용이하다.

  3. 신뢰성 및 복원력: 서버가 상태 정보를 저장하지 않기 때문에, 서버가 재시작되거나 장애가 발생해도 클라이언트의 요청에 영향을 주지 않는다. 클라이언트는 모든 요청에 필요한 정보를 포함하여 서버에 보내야 한다.

  4. HTTP 프로토콜과의 관계: HTTP 프로토콜은 기본적으로 무상태 프로토콜이다. 즉, 각 HTTP 요청은 독립적으로 처리되며, 클라이언트의 이전 요청에 대한 정보가 서버에 저장되지 않는다.

무상태 설계는 RESTful API와 같은 현대 웹 서비스 아키텍처에서 널리 사용되며, 각 요청이 필요한 모든 정보를 포함하도록 설계되어 있다. 이로 인해 시스템의 확장성과 유지보수성이 향상된다.

쿠키-세션 방식의 인증

쿠키-세션 방식의 인증은 웹 애플리케이션에서 사용자 인증을 관리하는 일반적인 방법이다. 이 방식은 사용자의 로그인 정보를 안전하게 저장하고, 이후의 요청에서 사용자의 신원을 확인하는 데 사용된다. 아래에서 쿠키와 세션의 개념 및 작동 방식을 설명하겠다.

쿠키와 세션의 개념

  1. 쿠키:

    • 웹 브라우저에 저장되는 작은 데이터 파일이다.
    • 서버가 클라이언트(사용자)에게 정보를 저장하고, 클라이언트가 다시 서버에 요청할 때 이 정보를 함께 전송한다.
    • 예를 들어, 로그인 시 서버는 사용자 ID와 같은 정보를 쿠키에 저장할 수 있다.
  2. 세션:

    • 서버에 저장되는 사용자 상태 정보를 의미한다.
    • 각 사용자는 고유한 세션 ID를 부여받고, 이 ID는 쿠키를 통해 클라이언트에 저장된다.
    • 서버는 세션 ID를 기반으로 사용자의 상태를 추적하고, 다양한 정보를 저장할 수 있다.

쿠키-세션 인증 과정

  1. 로그인:

    • 사용자가 로그인 정보를 입력하고 서버에 요청을 보낸다.
    • 서버는 사용자 정보를 확인하고, 유효한 사용자라면 세션을 생성하고 세션 ID를 반환한다.
  2. 세션 저장:

    • 서버는 세션 ID와 관련된 사용자 정보를 메모리나 데이터베이스에 저장한다.
  3. 쿠키 설정:

    • 서버는 클라이언트의 브라우저에 세션 ID를 쿠키로 저장한다. 이 쿠키는 사용자 브라우저에 저장되어 다음 요청 시 자동으로 서버에 전송된다.
  4. 인증 유지:

    • 사용자가 인증된 상태에서 다른 페이지를 요청할 때, 브라우저는 자동으로 쿠키에 저장된 세션 ID를 포함하여 요청을 보낸다.
    • 서버는 세션 ID를 확인하고, 해당 세션에 저장된 사용자 정보를 바탕으로 사용자를 인증한다.
  5. 로그아웃:

    • 사용자가 로그아웃을 요청하면 서버는 해당 세션을 종료하고, 클라이언트의 쿠키를 삭제하여 인증을 해제한다.

장점과 단점

  • 장점:

    • 사용자가 로그인한 상태를 쉽게 유지할 수 있다.
    • 서버에서 세션 정보를 관리하므로 보안성이 높다.
  • 단점:

    • 세션 데이터가 서버 메모리를 소모할 수 있으며, 많은 사용자가 동시에 접속할 경우 서버 부하가 증가할 수 있다.
    • 쿠키에 저장된 정보가 유출될 경우 보안 위험이 발생할 수 있다.

쿠키-세션 방식의 인증은 간편하고 널리 사용되지만, 보안과 성능을 고려하여 적절한 관리와 설정이 필요하다.

JWT(JSON Web Token) 기반 인증

JWT(JSON Web Token) 기반 인증은 사용자 인증을 위한 현대적인 방법으로, 클라이언트와 서버 간의 정보 교환을 안전하게 수행할 수 있는 방식이다. JWT는 JSON 형식으로 데이터를 안전하게 전송할 수 있도록 설계된 개방형 표준이다.

JWT의 구조

JWT는 세 부분으로 구성된다:

  1. 헤더(Header):

    • 어떤 알고리즘을 사용하여 서명했는지를 포함한다. 일반적으로 HMAC SHA256 또는 RSA 알고리즘을 사용한다.
    • 예시:
      {
        "alg": "HS256",
        "typ": "JWT"
      }
  2. 페이로드(Payload):

    • 토큰에 포함될 클레임(Claims) 정보를 담고 있다. 클레임은 사용자 정보나 권한 등의 데이터를 포함할 수 있다.
    • 예시:
      {
        "sub": "user_id",
        "name": "홍길동",
        "iat": 1516239022
      }
  3. 서명(Signature):

    • 헤더와 페이로드를 조합한 후, 지정된 알고리즘과 비밀 키를 사용하여 생성된다. 이 서명은 토큰의 무결성을 보장한다.

JWT는 위 세 부분을 점(.)으로 구분하여 연결한 문자열로 표현된다. 예를 들어:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyX2lkIiwibmFtZSI6Iu2VhO2XkO2VhOumVhO2VhOumVhO2VhO2VhO2VhO2VhO2VhIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT 인증 과정

  1. 로그인:

    • 사용자가 로그인 정보를 입력하고 서버에 요청한다.
    • 서버는 사용자 정보를 확인하고, 유효한 사용자라면 JWT를 생성하여 클라이언트에게 반환한다.
  2. JWT 저장:

    • 클라이언트는 받은 JWT를 로컬 스토리지나 쿠키에 저장한다.
  3. 인증 요청:

    • 클라이언트가 인증이 필요한 API를 요청할 때, 저장된 JWT를 Authorization 헤더에 포함하여 서버에 전송한다.
    Authorization: Bearer <token>
  4. 토큰 검증:

    • 서버는 JWT의 서명을 검증하여 토큰의 유효성을 확인한다. 유효한 경우, 페이로드에 포함된 사용자 정보를 바탕으로 요청을 처리한다.
  5. 로그아웃:

    • JWT는 서버 상태와 무관하게 작동하므로, 클라이언트에서 JWT를 삭제하거나 만료시간을 설정하여 로그아웃을 처리한다.

장점과 단점

  • 장점:

    • 무상태성: 서버가 세션 정보를 유지할 필요가 없어 확장성이 뛰어나다.
    • 자체 포함: JWT에는 사용자 정보가 포함되어 있어, 별도의 데이터베이스 조회 없이도 사용자 인증이 가능하다.
    • 크로스 도메인 지원: JWT는 다양한 도메인 간의 인증을 쉽게 처리할 수 있다.
  • 단점:

    • 토큰 크기: JWT는 사용자 정보를 포함하므로 세션 방식보다 크기가 크다.
    • 만료 처리: JWT는 만료된 후에도 클라이언트에 남아 있을 수 있으므로, 토큰 무효화 처리에 주의가 필요하다.
    • 보안: JWT가 유출될 경우, 토큰의 유효 기간 동안 누구나 해당 사용자로서 권한을 사용할 수 있다.

JWT 기반 인증은 특히 RESTful API와 같은 분산 시스템에서 널리 사용되며, 사용자 인증과 권한 부여를 간편하게 처리할 수 있는 강력한 방법이다.

0개의 댓글