Spring Security ‐ Spring Security OAuth 2.0 - dnwls16071/Backend_Summary GitHub Wiki

📚 OAuth 2.0

  • OAuth = Open + Authorization
  • The OAuth 2.0 Authorization Framework (RFC 6749 : https://ko.wikipedia.org/wiki/RFC)
  • OAuth 2.0 인가 프레임워크는 애플리케이션이 사용자 대신하여 사용자의 자원에 대한 제한된 액세스를 얻기 위해 승인 상호 작용을 함으로써 애플리케이션이 자체적으로 액세스 권한을 얻도록 한다.
  • 즉 사용자가 속한 사이트의 보호된 자원에 대해 애플리케이션의 접근을 허용하도록 승인하는 것을 의미한다.
  • Delegated Authorization Framework : 애플리케이션이 사용자의 데이터에 접근하도록 권한을 부여한다.

📚 OAuth 2.0 Open Source - KeyCloak

  • ID 및 접근 관리를 지원하는 인가 서버 오픈 소스로 사용자 연합, 강력한 인증, 사용자 관리, 세분화된 권한 부여 등을 제공한다.
  • KeyCloak Download
$ jwj@MacBook-Pro-von-jang-ujin bin % ./kc.sh start-dev
Updating the configuration and installing your custom providers, if any. Please wait.
2025-08-30 15:28:33,822 INFO  [io.quarkus.deployment.QuarkusAugmentor] (main) Quarkus augmentation completed in 2548ms
Running the server in development mode. DO NOT use this configuration in production.
2025-08-30 15:28:35,959 INFO  [org.keycloak.quarkus.runtime.storage.database.liquibase.QuarkusJpaUpdaterProvider] (main) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml
2025-08-30 15:28:37,313 INFO  [org.keycloak.spi.infinispan.impl.embedded.JGroupsConfigurator] (main) JGroups JDBC_PING discovery enabled.
2025-08-30 15:28:37,445 INFO  [org.infinispan.CONTAINER] (main) ISPN000556: Starting user marshaller 'org.infinispan.commons.marshall.ImmutableProtoStreamMarshaller'
2025-08-30 15:28:37,609 INFO  [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_918170, Site name: null
2025-08-30 15:28:37,691 INFO  [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm
2025-08-30 15:28:38,687 INFO  [io.quarkus] (main) Keycloak 26.3.3 on JVM (powered by Quarkus 3.20.2.1) started in 4.791s. Listening on: http://0.0.0.0:8080
2025-08-30 15:28:38,687 INFO  [io.quarkus] (main) Profile dev activated. 
2025-08-30 15:28:38,688 INFO  [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, keycloak, narayana-jta, opentelemetry, reactive-routes, rest, rest-jackson, smallrye-context-propagation, vertx]

📚 OAuth 2.0 Roles

  • OAuth 2.0 메커니즘은 4가지 종류의 역할을 담당하는 주체들에 의해 이루어지는 권한부여 체계이다.

Resource Owner(자원 소유자)

  • 보호된 자원에 대한 접근 권한을 부여할 수 있는 주체. 사용자로서 계정의 일부에 대한 접근 권한을 부여하는 사람
  • 사용자를 대신하여 작동하려는 모든 클라이언트는 먼저 사용자의 허가를 받아야 한다.

Resource Server(보호 자원 서버)

  • 타사 애플리케이션에서 접근하는 사용자의 자원이 포함된 서버를 의미한다.
  • 액세스 토큰을 수락 및 검증할 수 있어야 하며 권한 체계에 따라 요청을 승인할 수 있어야 한다.

Authorization Server(인가 서버)

  • 클라이언트가 사용자 계정에 대한 동의 및 접근을 요청할 때 상호 작용하는 서버로서 클라이언트의 권한 부여 요청을 승인하거나 거부하는 서버
  • 사용자가 클라이언트에게 권한 부여 요청을 승인한 후 access token을 클라이언트에게 부여하는 역할

Client(클라이언트)

  • 사용자를 대신하여 권한을 부여받아 사용자의 리소스에 접근하려는 애플리케이션
  • 사용자를 권한 부여 서버로 안내하거나 사용자 상호 작용 없이 권한 부여 서버로부터 직접 권한을 얻을 수 있다.

📚 OAuth 2.0 Client Types

  • RFC 6749 - https://datatracker.ietf.org/doc/html/rfc6749#section-2.1
  • 인증 서버에 클라이언트를 등록할 때 클라이언트 자격 증명인 클라이언트 아이디와 클라이언트 암호를 받는다.
  • 클라이언트 암호는 비밀이고 그대로 유지되어야 하는 반면 클라이언트 아이디는 공개이다.
  • 이 자격 증명은 인증 서버에 대한 클라이언트 ID를 증명한다.

기밀 클라이언트(Confidential Clients)

  • 기밀 클라이언트는 client_secret의 기밀성을 유지할 수 있는 클라이언트를 의미한다.
  • 일반적으로 사용자가 소스 코드에 액세스할 수 없는 서버에서 실행되는 응용 프로그램으로 Java와 같은 서버 측 언어로 작성된다.
  • 이런 유형의 애플리케이션은 대부분 웹 서버에서 실행되기 때문에 "웹앱"이라고 부른다.

공개 클라이언트(Public Clients)

  • 공개 클라이언트는 client_secret의 기밀을 유지할 수 없으므로 이러한 앱에는 secret이 사용되지 않는다.
  • 브라우저에서 실행되는 Javascript 애플리케이션, Android 또는 iOS 모바일 앱, 데스크톱에서 실행되는 기본 앱 뿐만 아니라 IoT/임베디드 장치에서 실행되는 애플리케이션이 있다.
  • Chrome 개발자 콘솔이나 디스어셈블러와 같은 디버깅 도구를 사용해 바이너리/실행 코드에서 기밀 정보를 추출할 수 있기 때문에 공개로 간주된다.
  • 서버 측이 아닌 리소스 소유자가 사용하는 장치에서 실행되는 모든 클라이언트는 공개 클라이언트로 간주되어야 한다.

📚 OAuth 2.0 Token Types

Access Token

  • 클라이언트에서 사용자의 보호된 리소스에 접근하기 위해 사용하는 일종의 자격 증명으로서 역할을 하며 리소스 소유자가 클라이언트에게 부여한 권한 부여의 표현이다.
  • 일반적으로 JWT 형식을 취하지만 사양에 따라 그럴 필요는 없다.
  • 토큰에는 해당 액세스 기간, 범위 및 서버에 필요한 기타 정보가 있다.
  • 타입에는 식별자 타입과 자체 포함 타입이 있다.

Refresh Token

  • 액세스 토큰이 만료된 후 새 액세스 토큰을 얻기 위해 클라이언트 응용 프로그램에서 사용하는 자격 증명
  • 액세스 토큰이 만료된 경우 클라이언트는 권한 부여 서버로 인증하고 Refresh Token을 전달한다.
  • 인증 서버는 Refresh Token의 유효성을 검사하고 새 액세스 토큰을 발급한다.
  • Refresh Token은 Access Token과 달리 권한 서버 토큰 엔드포인트에만 보내지고 리소스 서버에는 보내지 않는다.

Authorization Code

  • 권한 부여 코드 흐름에서 사용되며 이 코드는 클라이언트가 액세스 토큰과 교환할 임시 코드이다.
  • 사용자가 클라이언트가 요청하는 정보를 확인하고 인가 서버로부터 리다이렉트되어 받아온다.

식별자 타입(Identifier Type)

자체 포함 타입(Self-Contained Type)