[스프링 시큐리티] OAuth2.0 - 네이버 & 카카오 로그인


구현커밋

OAuth2.0

  • Open API로 제공되는 표준 인증 방법
  • 쉽게 말해서 (Naver, Kakao, Google, Facebook)에 가입된 사용자 정보로 내가 만든 서비스에 인증(로그인)을 하는 것

OAuth2.0의 4가지 주요 객체(역할)

  • Resource Owner
    • 로그인을 요청하는 사용자, 즉 인증 정보의 주인
  • Client
    • Resource Owner의 자원에 대한 접근을 Authorization Server에 요청하는 서비스(내가 만든 백엔드 서버)
  • Authorization Server
    • Resource Owner의 요청으로 사용자를 인증하고, 인증 토큰, access token을 발급해주는 인증 서버
  • Resource Server
    • Resource Owner의 자원을 가지고 있는 서버, access token을 발급받은 Client가 요청하면, 권한을 검증해서 자원을 반환

인증 절차

  • 1
    1. 사용자가 ‘카카오 로그인’ 버튼을 눌러 인증 시도(redirect_url을 함께 전달해서 인증이 완료되면 Client 서버로 redirect)
    •   GET /oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code HTTP/1.1
        Host: kauth.kakao.com
      
      1. 서버Authorization Server는 사용자를 인증하고 인가 코드를 발급(1번에서 전달받은 redirect_url로 인가 코드를 전달)
      2. 인가 코드를 전달받은 ClientAuthorization Server인가 코드를 전달하면서 access token 발급을 요청함
    •   POST /oauth/token HTTP/1.1
        Host: kauth.kakao.com
        Content-type: application/x-www-form-urlencoded;charset=utf-8
      
      1. access token을 이용해서 Resource Server에 사용자 정보를 요청함
    • kakao developers
    •   GET/POST /v2/user/me HTTP/1.1
        Host: kapi.kakao.com
        Authorization: Bearer {ACCESS_TOKEN}
        Content-type: application/x-www-form-urlencoded;charset=utf-8
      

네아로(네이버 아이디로 로그인)

  • 전체적인 절차는 카카오랑 비슷함 (인가 코드를 callback 메소드로 받아오고, 인가 코드로 access token 발급)
  • CLIENT_ID, CLIENT_SECRET는 네이버 개발자 페이지에 애플리케이션을 등록하고 발급받은 정보를 입력하면 된다.
  • 아래에 매핑된 URI(“/auth/naver/login”)을 개발자 페이지에 callback method로 등록하면, 사용자가 로그인을 하면 아래 메소드가 호출됨
  • 호출되면서 전달된 code와 state를 개발자 페이지에 나와있는대로 요청하면 access_token을 받아올 수 있음
      @GetMapping("/auth/naver/login")
      public ResponseEntity naverLoginCallback(String code, String state) {
          RestTemplate rt = new RestTemplate();
          HttpHeaders headers = new HttpHeaders();
          headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
    
          MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
          params.add("grant_type", "authorization_code");
          params.add("client_id", CLIENT_ID);
          params.add("client_secret", CLIENT_SECRET);
          params.add("code", code);
          params.add("state", state);
    
          HttpEntity<MultiValueMap<String, String>> naverTokenRequest = new HttpEntity<>(params, headers);
          ResponseEntity<String> response = rt.exchange(
                  "https://nid.naver.com/oauth2.0/token",
                  HttpMethod.POST,
                  naverTokenRequest,
                  String.class
          );
          return response;
      }
    

네아로에서 access_token 사용하기

  • 네이버 아이디로 로그인하고, 위에서 정의한 callback method가 실행되면 access_token이 발급된다.
  • access_token이 실제 resoucre server에 자원을 요청할 때 사용되는데, 이는 아래 페이지를 참고해서 사용할 수 있다.
  • 접근 토큰을 이용한 profile api 호출
  • 호출결과
  • 2





© 2020.02. by blupine