๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ์ธ ๊ณต๋ถ€/WEB-Spring,SpringBoot

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ & OAuth๋กœ ๊ตฌ๊ธ€ ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ์‹œํ‚ค๊ธฐ

by syLim___ 2024. 11. 12.
728x90

 

๊นƒํ—ˆ๋ธŒ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(oauth1110)์— ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ž์„ธํžˆ ์ •๋ฆฌํ•ด๋‘๊ธด ํ–ˆ์ง€๋งŒ,

๋ธ”๋กœ๊ทธ์—๋„ ์ „์ฒด์ ์ธ ํ๋ฆ„๋งŒ ์ •๋ฆฌํ•ด๋‘๋ ค๊ณ  ํ•œ๋‹ค.

 

๐Ÿ“Œ ๊ตฌ๊ธ€ API ์ฝ˜์†”์—์„œ OAuth ํด๋ผ์ด์–ธํŠธ ID ๋งŒ๋“ค๊ธฐ

- ๊ตฌ๊ธ€ API ์ฝ˜์†”์— ์ ‘์†ํ•˜์—ฌ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

- ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด -> ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ -> OAuth ํด๋ผ์ด์–ธํŠธ ID๋ฅผ ๋งŒ๋“ ๋‹ค.

 

- OAuth ํด๋ผ์ด์–ธํŠธ ์•„์ด๋””๋ฅผ ๋งŒ๋“ค ๋•Œ "์Šน์ธ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI"๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์นธ์ด ๋œจ๋Š”๋ฐ,

  ๊ทธ ์นธ์— "http://{์„œ๋น„์Šคip}:{port}/login/oauth2/code/google" ์„ ์ž…๋ ฅํ•ด์ค€๋‹ค.

- ์ด URI๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ ๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋Š” URI๋ผ๊ณ  ํ•œ๋‹ค.

 

- OAuth ํด๋ผ์ด์–ธํŠธ ID ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด, ํด๋ผ์ด์–ธํŠธID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

- ์ด๊ฒƒ์„ ๋ณต์‚ฌํ•ด๋’€๋‹ค๊ฐ€ application.yml ์„ค์ •ํŒŒ์ผ์— ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ“Œ ์™ธ๋ถ€ ์˜์กด์„ฑ๊ณผ ์„ค์ • ์ถ”๊ฐ€

springboot starter๋ฅผ ํ†ตํ•ด Spring Security์™€ OAuth2 Client ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  application.yml ์„ค์ •์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: {ํด๋ผ์ด์–ธํŠธ ID}
            client-secret: {ํด๋ผ์ด์–ธํŠธ ๋ณด์•ˆ ๋น„๋ฐ€๋ฒˆํ˜ธ}
            scope:
              - email
              - profile

 

 

๐Ÿ“Œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๊ตฌ๊ธ€๋กœ ํšŒ์›๊ฐ€์ž…ํ•˜๊ธฐ ๋ฒ„ํŠผ ์ถ”๊ฐ€

์„œ๋ฒ„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— "๊ตฌ๊ธ€ ํšŒ์›๊ฐ€์ž…ํ•˜๊ธฐ" ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ "/oauth2/authorization/google" ๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ๋งํฌ๋ฅผ ๊ฑธ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

(ํ•ด๋‹น url์— ๋Œ€ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•ด์ค„ ํ•„์š” ์—†๋‹ค.)

 

๐Ÿ“Œ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋ฅผ ํšŒ์›๊ฐ€์ž…์‹œํ‚ค๋Š” ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๊ธ€ OAuth ์„œ๋ฒ„์—์„œ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด, ๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์‘๋‹ต๊ณผ ์ฝ”๋“œ๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

2. ์šฐ๋ฆฌ ์„œ๋ฒ„๋Š” ์ด ์ฝ”๋“œ๋ฅผ ๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ , ๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‘๋‹ต๋ฐ›๋Š”๋‹ค.

3. ์šฐ๋ฆฌ ์„œ๋ฒ„๋Š” ์ด ์•ก์„ธ์Šค ํ† ํฐ์„ ๋‹ค์‹œ ๊ตฌ๊ธ€ ์‚ฌ์šฉ์ž API๊ฐ€ ์žˆ๋Š” ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์„œ ์‚ฌ์šฉ์ž ๊ตฌ๊ธ€ํ”„๋กœํ•„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

4. ์ด ์‚ฌ์šฉ์ž ๊ตฌ๊ธ€ํ”„๋กœํ•„ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ , ์šฐ๋ฆฌ ์„œ๋ฒ„ ํšŒ์›๊ฐ€์ž…์„ ์ž๋™์œผ๋กœ ์ง„ํ–‰์‹œํ‚จ๋‹ค. (์•„์ด๋””, ํŒจ์Šค์›Œ๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž„์˜๋กœ ์„ค์ •ํ•œ๋‹ค)

5. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž ๊ตฌ๊ธ€ ํ”„๋กœํ•„ ์ •๋ณด ์™ธ์— ์ถ”๊ฐ€๋กœ ๊ฐ€์ž…์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋ฉด, ์ถ”๊ฐ€ ์ •๋ณด ์ž…๋ ฅ์ฐฝ์„ ๋„์›Œ์ฃผ์–ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋„๋ก ํ•œ๋‹ค.

 

๐Ÿ“Œ ์‚ฌ์šฉ์ž ๊ตฌ๊ธ€ ํ”„๋กœํ•„ ์ •๋ณด๋Š” ์„ธ์…˜์— ์ €์žฅ๋œ๋‹ค!

- ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋กœ ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•˜๋ฉด,

  ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ ์ฒด์ธ์—์„œ Authentication ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹œํ๋ฆฌํ‹ฐ ์„ธ์…˜์— ์ €์žฅํ•œ๋‹ค.

 

- Authentication ์ธ์Šคํ„ด์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

    ์ด ์œ ์ € ์ •๋ณด๋Š”

    (1) ์ผ๋ฐ˜ ๋กœ๊ทธ์ธ์˜ ๊ฒฝ์šฐ UserDetailsService์˜ loadUserByUsername() ๋ฉ”์„œ๋“œ์— ์˜ํ•ด UserDetails ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

    (2) OAuth ๋กœ๊ทธ์ธ์˜ ๊ฒฝ์šฐ DefaultOAuth2UserService์˜ loadUser() ๋ฉ”์„œ๋“œ์— ์˜ํ•ด OAuth2User ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

 

- ์ด ์œ ์ € ์ •๋ณด๋Š” getDetails() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฆฌํ„ด๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

package org.springframework.security.core;

import java.io.Serializable;
import java.security.Principal;
import java.util.Collection;

public interface Authentication extends Principal, Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();

    Object getCredentials();

    Object getDetails();

    Object getPrincipal();

    boolean isAuthenticated();

    void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}

 

 

 

 

 

728x90