들어가기 전에
요즘에는 대부분의 웹서비스, 또는 앱서비스에서 소셜로그인을 빼놓을 수 없습니다. 소셜로그인을 사용하면 확실히 로그인을 빠르게 할 수 있다는 점과 매번 서비스마다 새로운 계정(아이디와 패스워드)를 만들 필요성이 없기 때문에 소셜로그인은 필수적으로 들어가는 기능인 것 같습니다. 소셜로그인의 기본 개념인 OAuth에 대해서 공부하고자 합니다.
01. OAuth
OAuth 2.0은 인증을 위한 개방형 표준 프로토콜로 인터넷 사용자들이 비밀번호를 제공하지 않고, 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수있는 개방형 표준 방법입니다.
1.1 OAuth 참여자
- 사용자(Resource Owner) : 계정을 가지고 있는 개인, 즉 리소스 소유자를 의미합니다. 본인의 정보에 접근할 수 있는 자격을 승인하는 주체입니다.
- 소비자(Client) : OAuth를 사용해 서비스 제공자에게 접근하는 웹사이트 or 애플리케이션, Resource Owner의 리소스를 사용하고자 접근 요청을 하는 애플리케이션입니다.
- 서비스 제공자 : OAuth를 통해 접근을 지원하는 웹 애플리케이션입니다. 즉 소셜로그인으로 예를들면 Google, Kakao, Facebook에 해당합니다. 서비스 제공자는 크게 2개로 나누어집니다.
- Resource Server: 사용자(Resource Owner)의 정보가 저장되어 있는 서버
- Authorization Server: 권한 서버로 client의 접근 자격 확인 및 token을 발급하여 권한을 부여합니다.
1.2 OAuth Version
현재 OAuth2.0을 사용하고.. 이제 그 이후 버전들도 나오는 것 같은데 결국 OAuth1.0을 사용하지 않고 2.0을 사용하는 것에 주목할 필요가 있습니다. OAuth1.0은 큰 문제가 하나 있는데 접근 토큰의 유효기간 없었습니다. 이 부분은 큰 문제가 발생할 수 있는데 토큰이 탈취된 경우 Resource에 대한 접근에 대해 보안적인 문제가 발생할 수 있습니다. OAuth2.0에는 AccessToken과 RefreshToken을 통해서 보안을 좀 더 높입니다.
또한 server 즉 서비스 제공자의 분리입니다. 역할이 좀 더 명확하게 구분되고 나누어지게 되면서 Resource Server와 Authorization Server로 분리되었습니다.
1.3 인증 절차 종류
- Authorization Code Grant: Authorization Server에서 받은 권한 코드로 리소스에 대한 액세스 토큰을 받는 방식
- Implicit Grant : 코드 없이 Access Token을 직접 받아 인증하는 방식
- Resource Owner Password Credentials Grant : client_id, client_secret을 Owner로부터 받아 인증하는 방식
- Client Credentials Grant : Client가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식이라고 하는데 흠.. 잘은 이해되지 않는다.
02. OAuth 예시
2.1 카카오 로그인
카카오로그인을 통해 토큰과 정보를 제공받을 수 있다.
아래의 코드는 FeignClient를 사용해서 카카오 로그인을 할 수 있는 기본적인 로직인데.. 사실 FeignClient를 쓰던 RestTemplate을 쓰던 카카오 로그인을 구현할때에 문제가 되지는 않는다. 따라서 아래의 parameter에 어떤 것이 들어가는 지를 주포인트로 잡아 보면 좋을 것 같습니다.
@FeignClient(name = "kakaoClient", configuration = KakaoFeignConfiguration.class)
public interface KakaoClient {
@PostMapping
KakaoInfo getProfile(URI baseUrl, @RequestHeader("Authorization") String accessToken);
@PostMapping
KakaoToken getToken(URI baseUrl, @RequestParam("client_id") String restAPIKey,
@RequestParam("redirect_uri") String redirectUrl,
@RequestParam("code") String code,
@RequestParam("grant_type") String grantType);
}
@Slf4j
@RequiredArgsConstructor
@Service
public class KakaoLoginService {
private final KakaoClient kakaoClient;
private final Environment env;
private final String AUTHORIZATION_CODE = "authorization_code";
@Value("${kakao.authUrl}")
private String kakaoAuthUrl;
@Value("${kakao.userApiUrl}")
private String kakaoUserApiUrl;
@Value("${kakao.restApiKey}")
private String restAPIKey;
private String redirectUrl;
public Member createMember(String code, String applicationEnv) throws URISyntaxException {
setRedirectUrl(applicationEnv);
KakaoInfo kakaoInfo = getProfile(code);
KakaoTalkUser kakaoTalkUser = new KakaoTalkUser();
return kakaoTalkUser.signup(kakaoInfo);
}
private KakaoInfo getProfile(String code) throws URISyntaxException {
KakaoToken kakaoToken = getToken(code);
return kakaoClient.getProfile(
new URI(kakaoUserApiUrl),
kakaoToken.getTokenType() + " " + kakaoToken.getAccessToken()
);
}
private KakaoToken getToken(String code) throws URISyntaxException {
return kakaoClient.getToken(new URI(kakaoAuthUrl), restAPIKey, redirectUrl, code, AUTHORIZATION_CODE);
}
...
}
결국에 카카오 소셜로그인을 구현해야 되는 상황이라면 Authorization Code를 발급받는 부분은 Frontend가 로직을 구성하고 Authorization code를 server에게 전달을 했을 때 서버는 카카오에게 token 발급 요청을 해서 받은 token을 통해 사용자의 정보를 받아와 Database에 저장하면 됩니다.
03. 중요한 포인트
1. Oauth예시 중 카카오 로그인이 이루어지는 과정에 대해서 설명해주세요.
-> 이미지 참고
-> 대신에 인증 절차 방법 중 Authorization Code Grant에 대한 과정이라는 것을 먼저 명시하고 설명하기.
2. Oauth1.0과 Oauth2.0 차이점은?
-> OAuth1.0은 접근 토큰(Request Token)의 유효기간 없었습니다. Oauth2.0에서는 AccessToken과 RefreshToken의 요효기간을 정해서 보안성을 높입니다.
-> 서비스 제공자의 역할이 좀 명확하게 분리되면서 Resource Server와 Authorization Server로 나누어졌습니다.
04. 참고자료
- 카카오 로그인 문서
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
- gyoogle/tech-interview-for-developer
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Web/OAuth.md
GitHub - gyoogle/tech-interview-for-developer: 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖
👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.
github.com
- [Wisdom] OAuth2.0란?
https://doqtqu.tistory.com/295
[OAuth] OAuth2.0란?
OAuth(Open Authorization)란? 자신이 소유한 리소스에 소프트웨어 애플리케이션이 접근할 수 있도록 허용해 줌으로써 접근 권한을 위임해주는 개방형 표준 프로토콜 OAuth 탄생 배경 OAuth이 등장하기 전
doqtqu.tistory.com
- OAuth 2.0 개념 총 정리
https://charming-kyu.tistory.com/36
OAuth 2.0 개념 총 정리
들어가며 OAuth 2.0을 실무, 토이프로젝트에서 많이 사용했던 기술이지만 항상 함께 제공해주는 라이브러리로 간단하게 구현을 했었습니다. 하지만 여태 사용해본 라이브러리는 특정 구조를 가진
charming-kyu.tistory.com
- twentiethcenturygangsta cassette-server code
https://github.com/twentiethcenturygangsta/cassette-server
GitHub - twentiethcenturygangsta/cassette-server
Contribute to twentiethcenturygangsta/cassette-server development by creating an account on GitHub.
github.com