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
가 요청하면, 권한을 검증해서 자원을 반환
인증 절차
- 사용자가 ‘카카오 로그인’ 버튼을 눌러 인증 시도(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
- 서버
Authorization Server
는 사용자를 인증하고 인가 코드
를 발급(1번에서 전달받은 redirect_url로 인가 코드를 전달) 인가 코드
를 전달받은 Client
는 Authorization Server
에 인가 코드
를 전달하면서 access token
발급을 요청함
POST /oauth/token HTTP/1.1
Host: kauth.kakao.com
Content-type: application/x-www-form-urlencoded;charset=utf-8
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 호출
- 호출결과