치지직 OAuth 로그인을 위한 API 연동을 해보도록 하겠습니다.
developers: https://developers.chzzk.naver.com/
develop document: https://chzzk.gitbook.io/chzzk/chzzk-api/authorization
어플리케이션 등록: https://developers.chzzk.naver.com/application
먼저, developers를 들어가게 되면, 다음과 같은 화면이 뜹니다.

이 사이트에서 어플리케이션 등록과 openApi 문서를 볼 수 있습니다.
→ document: 치지직 open api 문서
→ application: 애플리케이션 등록
API를 이용하기 위해서는 애플리케이션을 등록해야 합니다.

여기서 로그인 리디렉션 URL은 인증 서버에서 인증을 마친 후, 데이터 소스(인증 코드, state)를 어디 주소로 보내줄지를 나타내는 것입니다. 저는 백엔드 서버의 주소/callback 주소로 등록해줬습니다. 나중에 인증 코드 요청을 할 때, 이 리디렉션 url와 보낼 때 리디렉션 url을 대조합니다.

저는 유저 조회만 했습니다. 이 scope는 document에서 어떤 API를 쓸 지 선택하는 것이니, 자신에 맞게 선택하면 되겠습니다. 저는 채널명을 조회해야 해서 이렇게 했습니다.
이제 document를 보면서 인증 코드 요청 및 발급을 해보겠습니다.

여기서 주의할 점은,
인증코드를 발급받을 때는 사이트가 다르다는 것입니다.
GET https://chzzk.naver.com/account-interlock
여기에서 발급받을 수 있습니다.
그 외의 다른 API들은 Open Api 도메인에서 쓸 수 있습니다.
https://openapi.chzzk.naver.com
이번에는 인증 코드 발급 받는 것과 유저 정보를 조회하는 부분만 간단하게 할 것이기 때문에, 웹사이트를 통해 접속하도록 하겠습니다.
https://chzzk.naver.com/account-interlock?clientId={자신의 클라이언트 id}&redirectUri={자신의 리디렉션 URI}&state={아무거나}
이 주소로 접속을 하게 될 경우, 네이버 로그인을 하게 되며, 인증에 성공했을 경우, redirectUri?code={인증코드}&state={썼던거}로 리다이렉트하게 됩니다.
이때, 코드를 다음과 같이 작성하게 되면, 자동으로 백엔드에 code와 state를 입력 받아 처리를 할 수 있게 됩니다.
@GetMapping("{authType}/callback")
public ResponseEntity<ApiResponse<LoginResponse>> login(@PathVariable String authType,
@RequestParam String code,
@RequestParam String state) {
LoginResponse response = authService.login(authType, new LoginRequest(code, state));
return ApiResponseEntity.onSuccess(response);
}
이제 인증 코드를 받았으니 Access Token을 발급 받아보도록 하겠습니다. Access Token을 발급 받아야 다른 API 호출이 가능합니다.
이제는 Open Api 도메인을 사용해야 합니다.
https://openapi.chzzk.naver.com

private ChzzkLoginResponse getAccessToken(LoginRequest loginRequest) {
ChzzkApiResponse chzzkLoginResponse = restClient.post()
.uri(chzzkOAuthProperties.getAccessTokenUrl())
.contentType(MediaType.APPLICATION_JSON)
.body(ChzzkLoginRequest.of(loginRequest,
chzzkOAuthProperties.clientId(),
chzzkOAuthProperties.secret()))
.retrieve()
.body(ChzzkApiResponse.class);
return chzzkLoginResponse.content();
}
(tip) 여기서 body를 String.class로 바꾸면 응답을 볼 수 있습니다.
{"code":200,"message":null,"content":{"refreshToken":"${refreshToken}","accessToken":"${accessToken}","tokenType":"Bearer","expiresIn":86400,"scope":"유저 조회"}}
public record ChzzkApiResponse(int code, String message, ChzzkLoginResponse content) {
}
public record ChzzkLoginResponse(String accessToken, String refreshToken, String tokenType, String expiresIn) {
}

이번엔 유저 정보 조회를 하겠습니다. 유저 정보 조회는 Client 인증과 Access Token 인증 둘 다 해줘야 합니다.

public ChzzkUserResponse getUserInfo(LoginRequest loginRequest) {
ChzzkLoginResponse chzzkLoginResponse = getAccessToken(loginRequest);
return restClient.get()
.uri(chzzkOAuthProperties.getUserInfoUrl())
.header("Authorization", "Bearer " + chzzkLoginResponse.accessToken())
.header("Client-Id", chzzkOAuthProperties.clientId())
.header("Client-Secret", chzzkOAuthProperties.secret())
.header("Content-Type", "application/json")
.retrieve()
.body(ChzzkUserResponse.class);
}
return 부분에 있는 코드를 보시면 됩니다.
{"code":200,"message":null,"content":{"channelId":"${channelId}","channelName":"똥손 암살자 1563","nickname":"똥손 암살자 1563"}}
public record ChzzkUserResponse(String channelId, String channelName) {
public static ChzzkUserResponse of(String clientId, String channelName) {
return new ChzzkUserResponse(clientId, channelName);
}
}
이렇게 치지직 OAuth 2.0 인증 코드를 이용한 토큰 발급과 유저 정보 조회를 해보았습니다. 다음 포스팅에서는 OAuth는 무엇인가에 대해 알아보려고 합니다. 많관부!