Day 11

์„ธ์…˜ ์ €์žฅ์†Œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ

์ง€๊ธˆ๊นŒ์ง€์˜ ๋ฌธ์ œ

  • ํ˜„์žฌ๊นŒ์ง€์˜ ์„œ๋น„์Šค๋Š” ์•ฑ์„ ์žฌ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋กœ๊ทธ์ธ์ด ํ’€๋ฆผ โ‡’ ์„ธ์…˜์ด ๋‚ด์žฅ ํ†ฐ์บฃ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ

    = ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋‹ค ๋ณด๋‹ˆ ๋‚ด์žฅ ํ†ฐ์บฃ์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ์—์„  ํ•ญ์ƒ ์ดˆ๊ธฐํ™”๋จ

    = ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ํ†ฐ์บฃ์ด ์žฌ์‹œ์ž‘

  • ๋งŒ์•ฝ 2๋Œ€ ์ด์ƒ์˜ ์„œ๋ฒ„์—์„œ ์„œ๋น„์Šคํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ†ฐ์บฃ๋งˆ๋‹ค ์„ธ์…˜์˜ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•จ

    = ์„ธ์…˜ ์ €์žฅ์†Œ์— ๋Œ€ํ•ด ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

    • ํ†ฐ์บฃ ์„ธ์…˜์„ ์‚ฌ์šฉ

      • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ„ ๋‹ค๋ฅธ ์„ค์ •์ด ์—†์„๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ ํƒ๋˜๋Š” ๋ฐฉ์‹

      • ํ†ฐ์บฃ(WAS)์— ์„ธ์…˜์ด ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— 2๋Œ€ ์ด์ƒ์˜ WAS๊ฐ€ ๊ตฌ๋™๋˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ํ†ฐ์บฃ๋“ค ๊ฐ„์˜ ์„ธ์…˜ ๊ณต์œ ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”

    • MySQL๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ

      • ์—ฌ๋Ÿฌ WAS ๊ฐ„์˜ ๊ณต์šฉ ์„ธ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•

      • ๋งŽ์€ ์„ค์ •์ด ํ•„์š” ์—†์ง€๋งŒ, ๊ฒฐ๊ตญ ๋กœ๊ทธ์ธ ์š”์ฒญ๋งˆ๋‹ค DB IO๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ์ƒ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

      • ๋ณดํ†ต ๋กœ๊ทธ์ธ ์š”์ฒญ์ด ๋งŽ์ด ์—†๋Š” ๋ฐฑ์˜คํ”ผ์Šค, ์‚ฌ๋‚ด ์‹œ์Šคํ…œ ์šฉ๋„์—์„œ ์‚ฌ์šฉ

    • Redis, Memcached์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ DB๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ

      • B2C ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

      • ์‹ค์ œ ์„œ๋น„์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Embedded Redis์™€ ๊ฐ™์€ ๋ฐฉ์‹์ด ์•„๋‹Œ ์™ธ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ์„œ๋ฒ„๊ฐ€ ํ•„์š”

2๋ฒˆ์งธ ๋ฐฉ์‹์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒ

๐Ÿ‘‰ ์ด์œ  : ์„ค์ •์ด ๊ฐ„๋‹จ, ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์€ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋น„์šฉ์ ˆ๊ฐ์„ ์œ„ํ•ด์„œ

+Redis์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ DB๋Š” aws์‚ฌ์šฉ์‹œ ๋”ฐ๋กœ ์‚ฌ์šฉ๋ฃŒ๋ฅผ ์ง€๋ถˆํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•ด์•ผํ•จ

spring-session-jdbc ๋“ฑ๋ก

build.gradle์— ์˜์กด์„ฑ์„ ๋“ฑ๋ก

build.gradle

compile('org.springframework.session:spring-session-jdbc')

application-properties

spring.session.store-type=jdbc

์„ค์ •์„ ๋งˆ์ณค์œผ๋‹ˆ๊นŒ h2-console๋กœ ์ ‘์†ํ•ด์„œ ์„ธ์…˜์„ ์œ„ํ•œ ํ…Œ์ด๋ธ”(SPRING_SESSION, SPRING_SESSION_ATTRIBUTES)๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธ

โ†’ JPA๋กœ ์ธํ•ด ์„ธ์…˜ ํ…Œ์ด๋ธ”์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฑํžˆ ํ• ์ผ์€ ์—†์Œ

๊ธฐ์กด๊ณผ ๋™์ผํ•˜๊ฒŒ ์Šคํ”„๋ง์„ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ์„ธ์…˜์ด ํ’€๋ฆฐ๋‹ค โ†’ h2๋„ ์žฌ์‹œ์ž‘๋˜๊ธฐ ๋•Œ๋ฌธ์ž„

  • ํ•˜์ง€๋งŒ aws์— ์—…๋กœ๋“œํ•˜๊ฒŒ ๋˜๋ฉด rds๋กœ ๋ฐ”๋€Œ๋‹ˆ๊นŒ ์„ธ์…˜์ด ์•ˆํ’€๋ฆฐ๋‹ค

๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์ถ”๊ฐ€

๋„ค์ด๋ฒ„ API๋กœ ์ด๋™ํ•ด์„œ https://developers.naver.com/apps/#register?api=nvlogin

์‚ฌ์šฉํ•˜๊ณ 

application-oauth.properties์— ์ถ”๊ฐ€

application-oauth.properties

#registration
spring.security.oauth2.client.registration.naver.client-id = ํด๋ผ์ด์–ธํŠธID
spring.security.oauth2.client.registration.naver.client-secret = ํด๋ผ์ด์–ธํŠธpw
spring.security.oauth2.client.registration.naver.redirect-uri={baseUrl}/{action}/oauth2/code/{registrationId}
spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.naver.scope=name, email, profile_image
spring.security.oauth2.client.registration.naver.client-name = Naver

#provider
spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize
spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token
spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me
spring.security.oauth2.client.provider.naver.user_name_attribute=response
  • user_name_attribute = response

    • ๊ธฐ์ค€์ด ๋˜๋Š” user_name์˜ ์ด๋ฆ„์„ ๋„ค์ด๋ฒ„์—์„œ๋Š” response๋กœ ํ•ด์•ผํ•œ๋‹ค

    • ์ด์œ ๋Š” ๋„ค์ด๋ฒ„์˜ ํšŒ์› ์กฐํšŒ ์‹œ ๋ฐ˜ํ™˜๋˜๋Š” JSON ํ˜•ํƒœ

-๋„ค์ด๋ฒ„์˜ ์‘๋‹ต๊ฐ’ ์ตœ์ƒ์œ„ ํ•„๋“œ๋Š” resultCode, messge, response์ด๋‹ค

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ์ธ์‹์ด ๊ฐ€๋Šฅํ•œ ํ•„๋“œ๋Š” ์ € 3๊ฐœ์ค‘์— ํ•˜๋‚˜์—ฌ์•ผํ•œ๋‹ค

  • ๋ณธ๋ฌธ์—์„œ ๋‹ด๊ณ  ์žˆ๋Š” response๋ฅผ user_name์œผ๋กœ ์ง€์ •

  • ์ดํ›„๋กœ ์ž๋ฐ” ์ฝ”๋“œ๋กœ response์˜ id๋ฅผ user_name์œผ๋กœ ์ง€์ •

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ค์ • ๋“ฑ๋ก

OAuthAttributes์— ๋„ค์ด๋ฒ„์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ์ฝ”๋“œ์™€ ๋„ค์ด๋ฒ„ ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€

src/main/java/com/kyu/book/springboot/config/auth/dto/OAuthAttributes

public static OAuthAttributes of(String registrationId, String userNameAttributeName, Map<String, Object> attributes){
        if("naver".equals(registrationId)){
            return ofNaver("id", attributes);
        }
        return ofGoogle(userNameAttributeName, attributes);
    }

    private static OAuthAttributes ofNaver(String userNameAttributeName, Map<String, Object> attributes){
        Map<String, Object> response = (Map<String, Object>) attributes.get("response");
        return OAuthAttributes.builder()
                .name((String)response.get("name"))
                .email((String)response.get("email"))
                .picture((String)response.get("profile_image"))
                .attributes(response)
                .nameAttributeKey(userNameAttributeName)
                .build();
    }
  • ์—ฌ๊ธฐ์„œ

index.mustache์— ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€

src/main/java/resource/template/index.mustache

...

{{^userName}}
    <a href="/oauth2/authorization/google" class="btn btn-success active" role="button">Google Login</a>
    <a href="/oauth2/authorization/naver" class="btn btn-success active" role="button">Naver Login</a>
{{/userName}}

...
  • /oauth2/authorization/naver

    • ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ URL์€ application-oauth.properties์— ๋“ฑ๋กํ•œ redirect-url ๊ฐ’์— ๋งž์ถฐ์„œ ์ž๋™์œผ๋กœ ๋“ฑ๋ก

    • /oauth2/authorization ๊นŒ์ง€๋Š” ๊ณ ์ •์ด๊ณ  ๋งˆ์ง€๋ง‰ path๋งŒ ๊ฐ ์†Œ์…œ ๋กœ๊ทธ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉ

Last updated

Was this helpful?