[Mastering Spring 5.0] 6.6 Spring Security - OAuth 2.0
OAuth2 μΈμ¦
OAuth 2λ μ΄ν리μΌμ΄μ κ³Ό Facebook, GitHub λ° DigitalOcean κ³Ό κ°μ HTTP μλΉμ€μμ¬μ©μ κ³μ μ λν μ νλ μ‘μΈμ€ κΆνμ μ»μ μμκ² ν΄μ£Όλ μΈμ¦ νλ μ μν¬μ΄λ€. μ΄λ μ¬μ©μ κ³μ μ νΈμ€ν νλ μλΉμ€μ μ¬μ©μ μΈμ¦μ μμνκ³ νμ¬ μμ© νλ‘κ·Έλ¨μ μ¬μ©μ κ³μ μ λν μ‘μΈμ€ κΆνμ λΆμ¬νμ¬ μλνκ² λλ€. OAuth 2λ μΉ λ° λ°μ€ν¬ν± μμ© νλ‘κ·Έλ¨ λ° λͺ¨λ°μΌ μ₯μΉμ λν μΈμ¦ νλ¦μ μ 곡νκ² λλ€.
- 리μμ€ μμ μ (μ¬μ©μ) : 리μμ€ μμ μλ μμ μ κ³μ μ μ‘μΈμ€νκΈ° μν΄ μ΄ν리μΌμ΄μ μ μΈμ¦νλ μ¬μ©μ μ΄λ€. μμ© νλ‘κ·Έλ¨μ μ¬μ©μ κ³μ μ μ‘μΈμ€ κΆνμ λΆμ¬ λ κΆν (μ : μ½κΈ° λλ μ°κΈ° κΆν) μ “λ²μ"λ‘ μ νλλ€.
- 리μμ€ μλ² : 리μμ€ μλ²λ μ¬μ©μμ κ³μ μ νΈμ€νΈνλ©° 보μ μ μ§κ° νμν 리μμ€κ° μλ μλ²μ΄λ€.
- ν΄λΌμ΄μΈνΈ : ν΄λΌμ΄μΈνΈλ μ¬μ©μ κ³μ (μ¬μ©μ κ³μ μ νΈμ€νΈνλ 리μμ€ μλ²) μ‘μΈμ€νλ €λ μ΄ν리μΌμ΄μ μ΄λ€.
- κΆν μλ² : OAuth μλΉμ€λ₯Ό μ 곡νλ©°, μ¬μ©μμ μ μμ μΈμ¦νλ©° ν΄λΌμ΄μΈνΈκ° 리μμ€ μλ²μ μ‘μΈμ€ ν μ μλ κΆνμ λΆμ¬νλ€.
- μ΄ν리μΌμ΄μ μ μ¬μ©μμκ² λ¦¬μμ€ μλ² μμμ λν μ‘μΈμ€ κΆνμ μμ²νλ€.
- μ¬μ©μκ° μ‘μΈμ€ κΆνμ μ 곡νλ©΄ μ΄ν리μΌμ΄μ μ κΆνμ λΆμ¬ λ°λλ€.
- μ΄ν리μΌμ΄μ μ μ¬μ©μ κΆν λΆμ¬ λ° μ체 ν΄λΌμ΄μΈνΈ κΆν μ 보λ₯Ό κΆν μλ²μ μ 곡νλ€.
- μΈμ¦μ μ±κ³΅νλ©΄ μΈμ¦μ μν μ‘μΈμ€ ν ν°μ μ 곡νλ€.
- μ΄ν리μΌμ΄μ μ μΈμ¦μ μν΄ μ‘μΈμ€ ν ν°μ μ 곡νλ 리μμ€ μλ²λ₯Ό νΈμΆνλ€.
- μ‘μΈμ€ ν ν°μ΄ μ ν¨νλ©΄ 리μμ€ μλ²λ 리μμ€ μΈλΆ μ 보λ₯Ό λ°ννλ€.
Springboot OAuth 2 μΈμ¦ ꡬννκΈ°
μμ‘΄μ± μΆκ°
spring-security-oauth2
λ μ€νλ§ μν리ν°μ OAuth2 μ§μμ μ 곡νκΈ° μν λͺ¨λμ΄λ€. pom.xml
λλ build.gradle
μ μΆκ°νλ€.
pom.xml
|
|
build.gradle
|
|
κΆν λ° λ¦¬μμ€ μλ² μ€μ νκΈ°
μΌλ°μ μΌλ‘ κΆν μλ²μ 리μμ€ μλ²λ₯Ό λΆλ¦¬νμ§λ§, μμ μμ€λ κΆν μλ²μ 리μμ€ μλ²λ₯Ό λμΌνκ² μ§μ νμλ€.
|
|
- @EnableResourceServer : λ€μ΄μ€λ OAuth 2 ν ν°μ ν΅ν΄ μμ²μ μΈμ¦νλ μ€νλ§ μν리ν°λ₯Ό μ¬μ©νλ OAuth2 리μμ€ μλ²μ λν μ΄λ Έν μ΄μ μ΄λ€.
- @EnableAuthorizationServer :
DispatcherServlet
μ½ν μ€νΈμΈ νμ¬ μ΄ν리μΌμ΄μ μ½ν μ€νΈμμAuthorizationEndpoint
λ°TokenEndPoint
λ₯Ό μ¬μ©ν΄ κΆν λΆμ¬ μλ²λ₯Ό μ¬μ©ν μ μλλ‘ νλ μ΄λ Έν μ΄μ μ΄λ€.
κΆν μλ² μΈλΆ μ 보 ꡬμ±νκΈ°
μμ μμ€μλ application.properties
λ₯Ό ν΅ν΄ μΈλΆ ꡬμ±μ μ€μ μ νμμ§λ§, μλκ΅¬μ± μ€μ μ΄ μ λμ§ μμ @Configuration
μ ν΅νμ¬ μλ ꡬμ±μΌλ‘ μμ±νμλ€.
- Spring Boot 2.x λ²μ μμ OAuth2κ° μλ λ
AuthorizationServerConfigurerAdapter
λ₯Ό μμλ°μ κΆνμλ²μ μΈλΆ μ¬νμ ꡬμ±νλ€.
/src/main/java/com/mastering/spring/springboot/config/OAuthConfiguration.java
|
|
void configure(ClientDetailsServiceConfigurer configurer)
: ν΄λΌμ΄μΈνΈ ID μ Secret μ격μ¦λͺ μ 보λ₯Ό λ©λͺ¨λ¦¬μ μ€μ νλ€. Spring Security 5.0.0.RC1 μ΄ν μνΈλ³νμ μ± μ΄ λ³κ²½λμμΌλ―λ‘, κΈ°λ³Έκ°μΈDelegatingPasswordEncoder
μλ ν¨λμλ μνΈν λ©μλ μ λμ΄κ° νμνλ€. (bcrypt/noop/pbkdf2/scrypt/sha256) μ€ νλλ₯Ό μ¬μ©ν μ μμΌλ©°, μμ λ λ°λ‘ μΈμ½λ©μ μ§μ νμ§ μμκΈ° λλ¬Έμ {noop} μ λμ΄λ₯Ό μ€μ ν¨.void configure(AuthorizationServerEndpointsConfigurer endpoints)
: /oauth/token μλν¬μΈνΈμ λν μμΈ μλΉμ€λ₯Ό μ§μ ν μ μλ€.- spring-security 5.0 μμ λ¬λΌμ§ μνΈλ³νμ μ± , DelegatingPasswordEncoder
- Password Encoding
/src/main/java/com/mastering/spring/springboot/config/WebSecurityConfigurer.java
|
|
/src/main/java/com/mastering/spring/springboot/service/TestUserDetailService.java
|
|
UserDetailsService
: μ€μ DB λ νΉμ μ¬μ©μ μ 보λ₯Ό μ‘°ννμ¬ λ¦¬ν΄νλ€. μλλUserDetailsService
λ₯Ό μ¬μ©μ μ μλ‘ κ΅¬ννμ¬, μ΄μ μμ μμ μ€μ νapplication.yml
μ μλ νμμ 보λ₯Ό κ°μ Έμ κ²μ¦νλλ‘ μμ±νμλ€.
OAuth μμ² μ€ν
- μ‘μΈμ€ ν ν°μ μ»λλ€.
- μ‘μΈμ€ ν ν°μ μ¬μ©ν΄ μμ²μ μ€ννλ€.
μ‘μΈμ€ ν ν° μ»κΈ°
μ‘μΈμ€ν ν°μ μ΄μ©ν μμ² μ€ν
ν΅ν©ν μ€νΈ
|
|
-
ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails()
: μ¬μ©μ μ격μ¦λͺ κ³Ό ν΄λΌμ΄μΈνΈ μ격μ¦λͺ μΌλ‘ ResourceOwnerPasswordResourceDetails μ€μ νλ€. -
resource.setAccessTokenUri(createUrl("/oauth/token"))
: μΈμ¦μλ²μ URL μ ꡬμ±νλ€. -
OAuth2RestTemplate oauthTemplate = new OAuth2RestTemplate(resource, new DefaultOAuth2ClientContext())
:OAuth2RestTemplate
μ OAuth2 νλ‘ν μ½μ μ§μνλResttemplate
μ νμ₯μ΄λ€.