TIL 2021.05.19 [Oauth] [Data modeling]

Kyu·2021년 5월 19일
0

TIL

목록 보기
129/322

Github Oauth

프로젝트 시작하기 전에 Oauth 구현하고 싶어서 예제 프로젝트를 하나 만들어서 Github Oauth를 연동해봤다.

처음에는 요구사항을 참고해서 다음과 같은 to-do 목록을 만들고 Oauth 구현을 해보기로 했다.

  • Client id, secret 생성
  • 자바에서 어떻게 적용하는지 살펴보기
    • jdbctemplate을 이용한 테스트용 프로젝트 사용
    • spring security 사용하지 말기

먼저 생활코딩 Oauth 강의를 보면서 Oauth가 어떻게 작동하는 건지 배웠다. 그런 후에 자바에서 Oauth를 어떻게 만들어야하는 건지 계속 찾아다녔는데, 대부분 나오는 검색 결과들이 Spring security를 활용해서 Oauth를 구현했다. "Security 없이 어떻게 구현하는 거지?" 계속 고민하다가 그냥 GET, POST 방식의 요청과 응답이 전부였다는 것을 깨달았다. 왜냐면 생각해보니까 URL로도 보안상 위험하지만 어쨋든 access_token을 얻을 수 있었다는 걸 깨달았고 Security를 사용하는 이유는 물론 Oauth를 위한 통신을 보호하기 위함이었다. 그래서 테스트 해보는거니까 깊게 고민할거 없이 Github doc에 나오는대로 하면 됐다.

Implement Oauth in Java

Get access token

먼저 Spring Boot 디펜던시에 Web, Spring JDBC, Mysql 정도 추가하고 예제 프로젝트를 만들었다.

그리고 아래의 순서로 Oauth를 구현해보았다.

리소스오너: 유저
클라이언트: 톰캣서버
리소스서버: 깃헙

  1. 리소스오너가 로그인 링크를 통해 리소스서버에 authorization 요청
  2. 리소스서버는 code를 클라이언트의 API로 처리하는 redirect_uri 로 보냄
  3. 클라이언트의 API는 @RequestParam으로 code를 받음
  4. 받은 code와 client_id, client_secret으로 access_token을 받기위한 리소스서버에 대한 URL을 만들어서 요청.
  5. 성공적으로 요청하면 리소스서버에서 access_token을 클라이언트로 보냄

먼저 html에 client_idredirect_uri을 담은 URL을 만들어서 리소스서버에 authorization 요청을 했다. 그러면 로그인 페이지가 나오는데 로그인하고 권한 허용 버튼을 누르면 redirect_uri로 임시code를 리소스오너에게 보내주고 리소스오너가 모르는 사이에 클라이언트로 그 임시code가 전달된다.

클라이언트 서버에서 임시 codeclient_id, client_secret을 URL에 담아서 리소스서버에 보내면, 리소스서버가 그 정보들이 맞는지 확인하고 access_token을 생성하여 클라이언트로 발송한다. 그러면 이제 클라이언트는 access_token을 가지고 리소스오너가 가지는 리소스서버의 자료들을 이용할 수 있게 된다.

The challenge for me

링크를 통해서 code를 받는 것은 문제가 없었는데 어떻게 바로 클라이언트 서버에서 리소스서버로 다시 전송할지 고민이었다. 그 문제는 web을 디펜던시로 가지고 있으면 RestTemplate을 사용할 수 있게 되는데 이걸 가지고 Http 요청을 할 수 있다. 즉, 깃헙서버 입장에서 보면 정말 클라이언트가 되는 거다.

그리고 받은 access_token을 어떻게 커스텀 객체에 저장할 수 있을까? 도 고민이 생겨서 자바에서 JSON 데이터를 오브젝트로 파싱하는 방법을 찾아다니며 JSON in Java와 GSON을 디펜던시에 등록하고 원하는 값을 자바에서 데이터로 활용할 수 있게 했었다. 그런데 다른 자료를 보다가 RestTemplate에서 그냥 할 수 있었다. 코드로 보자면 이렇다.

// 자바에서 JSON in Java, GSON을 이용한 파싱 (말도 안되니까 안보셔도 무방)

SampleObject sampleObject = restTemplate.getForObject(url, sampleObject.class);
String jsonInString = new Gson().toJson(sampleObject);
JSONObject jSONObject = new JSONObject(jsonInString);
String accessToken = jSONObject.parse("리소스서버에서_오는_변수이름(access_token)")
// RestTemplate을 이용

SampleObject sampleObject = restTemplate.getForObject(url, sampleObject.class);

sampleObject에 이미 리소스서버에서 온 정보들이 모두 파싱되어있다. 예를 들어서, SampleObjectaccess_token이라는 필드를 추가하면 RestTemplate에 의해서 저절로 파싱되서 필드에 저장이 된다. (setter가 없어도 됨)

첫번째 코드는 그걸 모르고 저런 방식으로 사용했는데 필요없는 짓이었다.


Data modeling

이번주부터 시작한 Airbnb 클론 프로젝트. 데이터 모델링을 위해 먼저 기획서를 분석했다. 꽤..많은 기능들이 있었기 때문에 한번에 어떤 Entity들이 필요할지는 감이 안오지만 시작은 좋았다고 생각한다. 내일은 API에 대해서 팀원분들과 상의를 먼저 해보고 목 API를 배포하는 것을 목표로 해봐야겠다. 상의를 하는 과정에서 개념적 데이터 모델링은 어느 정도 윤곽이 잡히지 않을까 기대는 하고 있다. 그러면 목 API는 먼저 바로 만들 수 있지 않으려나?

profile
TIL 남기는 공간입니다

0개의 댓글