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
기밀 클라이언트(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)