Python의 GIL(Global Interpreter Lock)과 멀티스레딩의 한계

이미지
Python은 간결하고 강력한 문법으로 널리 사용되는 프로그래밍 언어이지만, 멀티스레딩 환경에서 성능을 제한하는 GIL(Global Interpreter Lock) 이라는 고유한 특성을 가지고 있습니다. 이 글에서는 GIL이 무엇인지, Python에서 멀티스레딩이 어떻게 동작하는지, 그리고 GIL이 멀티스레딩의 성능에 어떤 한계를 가져오는지에 대해 알아보겠습니다. GIL(Global Interpreter Lock)이란? GIL은 Python 인터프리터가 한 번에 하나의 스레드만 Python 바이트코드를 실행할 수 있도록 보장하는 메커니즘입니다. GIL은 Python의 메모리 관리와 관련된 내부 구조의 일관성을 유지하기 위해 도입되었습니다. 특히, CPython(가장 널리 사용되는 Python 구현)에서 GIL은 필수적인 요소입니다. GIL의 주요 특징: 단일 스레드 실행 보장 : GIL은 한 번에 하나의 스레드만 Python 인터프리터에서 실행되도록 보장합니다. 여러 스레드가 동시에 실행될 수 있지만, GIL에 의해 이들이 순차적으로 실행됩니다. 멀티코어 활용 제한 : GIL로 인해 Python 멀티스레딩은 멀티코어 CPU의 성능을 충분히 활용하지 못합니다. 다중 스레드가 존재하더라도 실제로는 하나의 코어에서 순차적으로 실행되기 때문입니다. IO 바운드 작업 최적화 : GIL은 CPU 바운드 작업에서는 성능에 영향을 미치지만, IO 바운드 작업에서는 상대적으로 영향을 덜 받습니다. 이는 IO 작업이 진행되는 동안 다른 스레드가 실행될 수 있기 때문입니다. Python에서의 멀티스레딩 멀티스레딩은 프로그램이 여러 스레드를 통해 병렬로 작업을 수행하는 방식입니다. Python의 threading 모듈은 멀티스레딩을 지원하며, 다양한 병렬 처리 작업을 수행할 수 있습니다. 그러나 GIL의 존재로 인해 Python의 멀티스레딩은 기대했던 만...

OAuth 2.0의 인증 플로우와 OpenID Connect 차이점

OAuth 2.0은 인터넷 애플리케이션에서 인증 및 권한 부여를 처리하는 표준 프로토콜로, 사용자가 자신의 자격 증명을 제3자 애플리케이션과 공유하지 않고도 리소스에 안전하게 접근할 수 있게 합니다. OpenID Connect는 OAuth 2.0을 기반으로 사용자 인증(Authentication)을 위한 프로토콜입니다. 이 글에서는 OAuth 2.0의 주요 인증 플로우를 설명하고, OpenID Connect와의 차이점을 살펴보겠습니다.


어두운 방 안 책상위에 노트북이 놓여있고 조명이 켜있다.


OAuth 2.0의 기본 개념

OAuth 2.0은 권한 부여 프레임워크로, 사용자와 자원의 소유자가 클라이언트 애플리케이션에 제한된 접근 권한을 부여할 수 있도록 합니다. OAuth 2.0은 인증(Authentication)보다는 권한 부여(Authorization)에 초점을 맞추고 있으며, 사용자의 자격 증명을 직접 노출하지 않고도 애플리케이션이 리소스 서버에 안전하게 접근할 수 있게 합니다.

주요 용어:

  • 리소스 소유자(Resource Owner): 접근 권한을 부여할 수 있는 사용자 또는 애플리케이션.
  • 클라이언트(Client): 리소스에 접근하려는 애플리케이션.
  • 리소스 서버(Resource Server): 보호된 리소스를 호스팅하는 서버. 예: API 서버.
  • 권한 부여 서버(Authorization Server): 사용자를 인증하고, 접근 토큰(Access Token)을 발급하는 서버.

OAuth 2.0의 인증 플로우

OAuth 2.0은 다양한 시나리오에 맞게 여러 가지 인증 플로우(Authorization Grant)를 제공합니다. 주요 플로우는 다음과 같습니다:

1. 권한 부여 코드 그랜트(Authorization Code Grant)

흐름: 가장 일반적으로 사용되는 플로우로, 주로 서버사이드 애플리케이션에서 사용됩니다. 클라이언트는 리소스 소유자(사용자)로부터 권한 부여 코드를 받아, 이를 통해 접근 토큰을 얻습니다.

과정:

  1. 사용자가 권한 부여 서버에 로그인하여 권한 부여 코드 발급을 승인합니다.
  2. 클라이언트가 권한 부여 코드를 받아, 이를 권한 부여 서버에 제출하여 접근 토큰을 발급받습니다.
  3. 클라이언트는 접근 토큰을 사용하여 리소스 서버에 요청을 보냅니다.
사용자 -> 권한 부여 서버: 권한 부여 코드 요청
권한 부여 서버 -> 사용자: 권한 부여 코드 발급
클라이언트 -> 권한 부여 서버: 접근 토큰 요청
권한 부여 서버 -> 클라이언트: 접근 토큰 발급
클라이언트 -> 리소스 서버: 접근 토큰으로 리소스 요청

2. 암시적 그랜트(Implicit Grant)

흐름: 주로 자바스크립트 기반의 클라이언트 애플리케이션에서 사용됩니다. 접근 토큰이 직접 발급되며, 권한 부여 코드 단계가 생략됩니다.

과정:

  1. 사용자가 권한 부여 서버에 로그인하여 접근 토큰 발급을 승인합니다.
  2. 클라이언트는 접근 토큰을 받아, 이를 통해 리소스 서버에 요청을 보냅니다.
사용자 -> 권한 부여 서버: 접근 토큰 요청
권한 부여 서버 -> 클라이언트: 접근 토큰 발급
클라이언트 -> 리소스 서버: 접근 토큰으로 리소스 요청

3. 자원 소유자 비밀번호 자격 증명 그랜트(Resource Owner Password Credentials Grant)

흐름: 사용자가 클라이언트에게 자신의 사용자 이름과 비밀번호를 제공하는 방식입니다. 주로 신뢰할 수 있는 애플리케이션에서 사용되며, 보안상의 이유로 권장되지 않습니다.

과정:

  1. 사용자가 클라이언트에 사용자 이름과 비밀번호를 제공합니다.
  2. 클라이언트가 이 자격 증명을 권한 부여 서버에 전달하여 접근 토큰을 발급받습니다.
  3. 클라이언트는 접근 토큰을 사용하여 리소스 서버에 요청을 보냅니다.
사용자 -> 클라이언트: 사용자 이름과 비밀번호 제공
클라이언트 -> 권한 부여 서버: 접근 토큰 요청
권한 부여 서버 -> 클라이언트: 접근 토큰 발급
클라이언트 -> 리소스 서버: 접근 토큰으로 리소스 요청

4. 클라이언트 자격 증명 그랜트(Client Credentials Grant)

흐름: 애플리케이션 자체가 인증을 받아야 하는 서버 간 통신에서 사용됩니다. 사용자가 관여하지 않고, 클라이언트 자격 증명을 통해 접근 토큰이 발급됩니다.

과정:

  1. 클라이언트가 자신의 자격 증명을 권한 부여 서버에 제출합니다.
  2. 권한 부여 서버는 클라이언트에게 접근 토큰을 발급합니다.
  3. 클라이언트는 접근 토큰을 사용하여 리소스 서버에 요청을 보냅니다.
클라이언트 -> 권한 부여 서버: 접근 토큰 요청
권한 부여 서버 -> 클라이언트: 접근 토큰 발급
클라이언트 -> 리소스 서버: 접근 토큰으로 리소스 요청

OpenID Connect란?

OpenID Connect는 OAuth 2.0을 기반으로 사용자 인증을 위한 프로토콜입니다. OAuth 2.0이 주로 권한 부여에 집중하는 반면, OpenID Connect는 사용자 인증을 다루며, OAuth 2.0의 위에 사용자 인증 계층을 추가한 것입니다.

주요 특징:

  • ID 토큰(ID Token): OpenID Connect는 OAuth 2.0에서 제공되는 접근 토큰 외에도 ID 토큰을 발급합니다. ID 토큰은 JWT(JSON Web Token) 형식으로, 인증된 사용자의 정보(예: 사용자 ID, 발급자, 유효기간 등)를 포함합니다.
  • 표준화된 사용자 정보 제공: OpenID Connect는 표준화된 방식으로 사용자의 프로필 정보를 제공하는 엔드포인트를 정의합니다. 이를 통해 클라이언트는 사용자의 인증 상태와 프로필 정보를 쉽게 얻을 수 있습니다.

OpenID Connect의 인증 흐름:

OpenID Connect의 인증 흐름은 OAuth 2.0의 권한 부여 코드 그랜트 플로우와 유사하지만, 추가로 ID 토큰이 발급됩니다.

사용자 -> 권한 부여 서버: 권한 부여 코드 요청 (OpenID Scope 포함)
권한 부여 서버 -> 사용자: 권한 부여 코드 발급
클라이언트 -> 권한 부여 서버: 접근 토큰 및 ID 토큰 요청
권한 부여 서버 -> 클라이언트: 접근 토큰 및 ID 토큰 발급
클라이언트 -> 리소스 서버: 접근 토큰으로 리소스 요청

OAuth 2.0과 OpenID Connect의 차이점

  • 목적:
    OAuth 2.0: 주로 권한 부여에 중점을 두며, 사용자가 자신의 자격 증명을 제공하지 않고 제3자 애플리케이션이 리소스에 접근할 수 있도록 합니다.
    OpenID Connect: OAuth 2.0을 기반으로 사용자 인증을 처리합니다. 즉, 사용자가 누구인지 확인하고, 인증된 사용자 정보를 클라이언트에 제공하는 데 중점을 둡니다.
  • 토큰 종류:
    OAuth 2.0: 접근 토큰(Access Token)을 발급하여 리소스 서버에 대한 접근 권한을 부여합니다.
    OpenID Connect: 접근 토큰 외에도 ID 토큰(ID Token)을 발급하여 사용자 인증 정보를 제공합니다.
  • 사용 사례:
    OAuth 2.0: 사용자가 자신의 리소스(예: Google Drive 파일, Facebook 프로필 데이터 등)에 제3자 애플리케이션이 접근할 수 있도록 권한을 부여하는 시나리오에서 사용됩니다.
    OpenID Connect: 사용자가 애플리케이션에 로그인하고 인증 정보를 공유하는 시나리오에서 사용됩니다. 예를 들어, "Google로 로그인" 기능은 OpenID Connect를 사용하여 구현됩니다.
  • 프로토콜 구조:
    OAuth 2.0: 독립적인 권한 부여 프로토콜로, 인증을 명확하게 정의하지 않습니다.
    OpenID Connect: OAuth 2.0을 확장하여 인증 계층을 추가하고, 사용자 인증에 필요한 추가 엔드포인트와 흐름을 정의합니다.

결론

OAuth 2.0과 OpenID Connect는 현대 웹 애플리케이션에서 인증 및 권한 부여를 처리하는 중요한 프로토콜입니다. OAuth 2.0은 주로 권한 부여를 다루며, 제3자 애플리케이션이 리소스에 안전하게 접근할 수 있도록 합니다. 반면, OpenID Connect는 OAuth 2.0을 기반으로 사용자 인증을 처리하며, ID 토큰을 통해 인증된 사용자 정보를 제공합니다.

OAuth 2.0과 OpenID Connect를 올바르게 이해하고 활용하면, 애플리케이션의 보안과 사용자 경험을 크게 개선할 수 있습니다. 이를 통해 사용자가 안전하게 리소스에 접근하고, 제3자 애플리케이션에 자신의 자격 증명을 노출하지 않으면서도 다양한 서비스를 사용할 수 있게 됩니다.

이 블로그의 인기 게시물

머신러닝 모델 학습의 데이터 전처리 기법

리액트 네이티브 vs Flutter: 크로스 플랫폼 개발 비교