๐Ÿ’ Spring/Spring Security

[Spring Security] ์Šคํ”„๋ง ๋ถ€ํŠธ OAuth2๋ฅผ ์ด์šฉํ•œ ๊ตฌ๊ธ€ ๊ณ„์ • ๋กœ๊ทธ์ธ (์ง์ ‘ ๊ตฌํ˜„)

2021. 5. 4. 00:56
๋ชฉ์ฐจ
  1. 1. ์ธ์ฆ ์ฝ”๋“œ ๋ฐ›๊ธฐ
  2. 2. ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  Access ํ† ํฐ์œผ๋กœ ๊ตํ™˜ํ•˜๊ธฐ
  3. 2-1. Redirect URI ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Controller ์ƒ์„ฑ
  4. 3. ํ”„๋กœํ•„ ์ •๋ณด ์š”์ฒญํ•˜๊ธฐ
  5. REFERENCE
๋ฐ˜์‘ํ˜•

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š”  ๊ตฌ๊ธ€๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  :

  • ๋„ค์ด๋ฒ„ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  • ์นด์นด์˜ค ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  • ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ•˜๊ธฐ์œ„ํ•ด ํ•„์š”ํ•œ API ํ‚ค ๋ฐœ๊ธ‰์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

1. ์ธ์ฆ ์ฝ”๋“œ ๋ฐ›๊ธฐ

์›ํ•˜๋Š” ํƒœ๊ทธ์— ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

<a href="https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 response_type=code&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id">๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ</a>

 

ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๊ฒŒ ๋˜๋ฉด, ๊ตฌ๊ธ€ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•œ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ URI๋กœ ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งํฌ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ํŒŒ๋ผ๋ฏธํ„ฐ์— code๊ฐ’์ด ๋‹ด๊ฒจ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

http://localhost:8080/login/oauth2/code/google?code=4%2F0AY0e-g6cMCFbgwTV.........AFZl50QB77171EBPQApBwA

 

2. ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  Access ํ† ํฐ์œผ๋กœ ๊ตํ™˜ํ•˜๊ธฐ

 

2-1. Redirect URI ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Controller ์ƒ์„ฑ

@GetMapping("/google")
@ResponseBody
public String googleOAuthRedirect(@RequestParam String code) {

    RestTemplate rt = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/x-www-form-urlencoded");

    MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
    params.add("client_id", "986673395771-5hs9a0e3keolbsa9rvc0ologqrq21vlm.apps.googleusercontent.com");
    params.add("client_secret", "BaTi_oegV5ts5yMkHUhGv-ZN");
    params.add("code", code);
    params.add("grant_type", "authorization_code");
    params.add("redirect_uri", "http://localhost:8080/login/oauth2/code/google");

    HttpEntity<MultiValueMap<String, String>> accessTokenRequest = new HttpEntity<>(params, headers);

    ResponseEntity<String> accessTokenResponse = rt.exchange(
    	"https://oauth2.googleapis.com/token",
        HttpMethod.POST,
        accessTokenRequest,
        String.class
    );
    
    return "response : " + accessTokenResponse.getBody();
}

๊ฐ๊ฐ ์•Œ๋งž์€ ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ค€ ๋’ค ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด, ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

3. ํ”„๋กœํ•„ ์ •๋ณด ์š”์ฒญํ•˜๊ธฐ

๋„์ €ํžˆ ๋ชป ์ฐพ๋‹ค๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ์š”์ฒญ์„ ์ฐพ์•˜๋Š”๋ฐ ๋งž๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค..

 

์œ„์˜ ์ปจํŠธ๋กค๋Ÿฌ์— ์•„๋ž˜ ํ”„๋กœํ•„ ์š”์ฒญ ์ฝ”๋“œ๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

	... ์ฝ”๋“œ ์ƒ๋žต ....
    
    // ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ, ํ”„๋กœํ•„ ์ •๋ณด ์–ป์–ด์˜ค๋Š” ์š”์ฒญ
    HttpHeaders headers1 = new HttpHeaders();
    headers1.add("Authorization", "Bearer " + googleOauthParams.getAccess_token());

    HttpEntity profileRequest = new HttpEntity(headers1);

    ResponseEntity<String> profileResponse = rt.exchange(
        "https://oauth2.googleapis.com/tokeninfo?id_token=" + googleOauthParams.getId_token(),
        HttpMethod.GET,
        profileRequest,
        String.class
    );
    
    return "ํ”„๋กœํ•„ ์ •๋ณด : " + profileResponse.getBody();
}

 

 

์ด๋ ‡๊ฒŒ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, ์•„๋ž˜ ์ฒ˜๋Ÿผ ์ •์ƒ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

{
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

 

์ด์ƒ์œผ๋กœ ๊ตฌ๊ธ€ ์•„์ด๋””๋กœ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.


REFERENCE

 

์›น ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— OAuth 2.0 ์‚ฌ์šฉ  |  Google ID ํ”Œ๋žซํผ  |  Google Developers

 

developers.google.com

 

๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
  1. 1. ์ธ์ฆ ์ฝ”๋“œ ๋ฐ›๊ธฐ
  2. 2. ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  Access ํ† ํฐ์œผ๋กœ ๊ตํ™˜ํ•˜๊ธฐ
  3. 2-1. Redirect URI ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Controller ์ƒ์„ฑ
  4. 3. ํ”„๋กœํ•„ ์ •๋ณด ์š”์ฒญํ•˜๊ธฐ
  5. REFERENCE
'๐Ÿ’ Spring/Spring Security' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring Security] ์Šคํ”„๋ง ๋ถ€ํŠธ OAuth2-client๋ฅผ ์ด์šฉํ•œ ์†Œ์…œ(๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค) ๋กœ๊ทธ์ธ ํ•˜๊ธฐ
  • [Spring Security] ์Šคํ”„๋ง ๋ถ€ํŠธ OAuth2๋ฅผ ์ด์šฉํ•œ ๋„ค์ด๋ฒ„ ๊ณ„์ • ๋กœ๊ทธ์ธ (์ง์ ‘ ๊ตฌํ˜„)
  • [Spring Security] ์Šคํ”„๋ง ๋ถ€ํŠธ OAuth2๋ฅผ ์ด์šฉํ•œ ์นด์นด์˜ค ๊ณ„์ • ๋กœ๊ทธ์ธ (์ง์ ‘ ๊ตฌํ˜„)
  • [Spring Security] ์Šคํ”„๋ง ๋ถ€ํŠธ OAuth2 ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค API ํ‚ค ๋ฐœ๊ธ‰ํ•˜๊ธฐ
iseunghan
iseunghan
๊พธ์ค€ํ•˜๊ฒŒ ์—ด์‹ฌํžˆ..
iseunghan
iseunghan

๊ณต์ง€์‚ฌํ•ญ

  • ์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์˜ค๋Š˜์ด ๋˜๊ธฐ ์œ„ํ•ด ๐Ÿ”ฅ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (261)
    • ๐Ÿ’ Spring (14)
      • ๊ฐœ๋… ๋ฐ ์ดํ•ด (2)
      • Spring ํ•ต์‹ฌ ๊ธฐ์ˆ  (24)
      • Spring REST API (8)
      • Spring MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  (7)
      • Spring Security (23)
      • Spring in Action (1)
    • ๐ŸŒป JAVA (84)
      • ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ (20)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ (13)
      • ๋””์ž์ธ ํŒจํ„ด (7)
      • ์ •๋ฆฌ์ •๋ฆฌ์ •๋ฆฌ (43)
      • JUnit (1)
    • ๐Ÿ”– Snippets (3)
      • Javascript (3)
    • โš™๏ธ Devops (22)
      • โ› Git (11)
      • ๐Ÿณ Docker (6)
      • ๐Ÿง Linux (3)
      • ๐ŸŒˆ Jenkins (1)
      • ๐Ÿ“ฌ Kafka (1)
    • ๐Ÿ’ฌ ETC.. (4)
      • ๐Ÿ’ป macOS (2)
    • ๐ŸŒง๏ธ ORM (2)
      • JPA (2)
    • ๐Ÿ Python (2)
    • ๐Ÿ“š Databases (15)
      • ์˜ค๋ผํด๋กœ ๋ฐฐ์šฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ก ๊ณผ ์‹ค์Šต(2ํŒ) (3)
      • RealMySQL 8.0 (8)
    • ๐Ÿ”ฅ Computer Science (5)
      • ๐Ÿ“ก ๋„คํŠธ์›Œํฌ (5)
    • ๐Ÿท๏ธ ํ˜‘์—… (1)
    • ๐Ÿ“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (38)
      • BAEKJOON\์ˆ˜ํ•™ 1, ์ˆ˜ํ•™ 2 (8)
      • BAEKJOON\์žฌ๊ท€ (5)
      • BAEKJOON\๋ธŒ๋ฃจํŠธ ํฌ์Šค (3)
      • BAEKJOON\์ •๋ ฌ (1)
      • BAEKJOON\๋ฐฑํŠธ๋ž˜ํ‚น (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\์ด๋ถ„ํƒ์ƒ‰ (1)
      • BAEKJOON\๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (9)
      • BAEKJOON\๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
    • โœจ ISEUNGHAN (1)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
๋ฐ˜์‘ํ˜•
hELLO ยท Designed By ์ •์ƒ์šฐ.
iseunghan
[Spring Security] ์Šคํ”„๋ง ๋ถ€ํŠธ OAuth2๋ฅผ ์ด์šฉํ•œ ๊ตฌ๊ธ€ ๊ณ„์ • ๋กœ๊ทธ์ธ (์ง์ ‘ ๊ตฌํ˜„)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.