naver이나 kakao 같이 대형 사이트를 통해서 특정 사이트에 로그인을 하면 인증처리에 대한 수고를 덜 수가 있다.
단점도 있는데 대형 사이트에서 제공하는 정보로는 사이트를 운영할수 없는경우에는 별도의 서비스를 구축을 해야한다.
특정 블로그에 로그인 요청을 하게 되면 blog에서 로그인 페이지를 응답해주게 된다.
이곳에서 kakao 로그인을 선택하게 되면 요청 자체가 카카오 서버로 들어가게 되고 카카오에서 정상이라고 판단을 하면 blog로 callback 해주게 된다.
CallBack할떄 하나의 코드를 주는데 코드를 정상적으로 받게 된다면 인증이 되었다고 인식을 한다.
카카오로 로그인을 요청을 할떄 카카오의 서버에는 홍길동의 정보가 저장이 되고 blog에서 코드에 대한 응답을 할떄 kakao서버에 정보를 달라는 권한을 요청을 하게 된다.
-> 이 과정이 정상적으로 이루어 지면 Acess Token을 blog에 다시 돌려주게 되고 토큰을 받게되면 blog서버가 kakao서버에 접근할수 있는 권한을 가지게 된다.
단순히 코드를 받은것은 인증이 되었다는 것을 의미하고
Token을 받았다는것은 카카오가 사용자에 대한 권한을 blog에 위임했다고 생각하면 된다.
요청 : 리소스 오너
blog : 클라이언트
카카오 : 인증 서버
카카오 자원,서버 : 리소스 서버
a 태그를 활용하여 요청하는 방식은 무조건 Get방식을 사용한다.
위에서 설명을 했듯이 카카오 로그인 서비스는 코드을 다시 돌려받기 @ResponseBody를 통해서 code를 받을수 있게 된다.
이후 요청을 하여 토큰을 받게 되는데 이것을 따로 로직을 구현해야 한다.
== 요청 코드 ==
Post방식으로 key-value를 요청을 해야한다.
RestTemplate을 통해서 담일 데이터가 key-value라는 것을 알려주며
헤더를 담을 HttpHeaders, body를 담을 MultiValueMap를 선언해 주었다.
이후 HttpEntity에 key와 value를 모두 같이 저장을 한다.
이수 exchange메서드를 통해서 최초 템플릿인 RestTemplate에 값을 넣어주면 된다.
이렇게 되면 response에 요청한 로직에 대한 응답으로 토큰이 들어가게 된다.
================================================================
header를 통해서 데이터를 담아라 요청을 하고 그에대한 응답을 response에 담는 코드이다.
일단 ObjectMapper를 통해서 빈 객체를 만들고 Token객체를 만들어서 ObjectMapper에 값을 넣어서 Token을 구성해 준다.
그후 1번 과정과 동일하게 템플릿을 구성해 요청을 한뒤 response2를 통해서 값을 받아오면 된다.
이후 로그인 시스템을 구성하기 위해서 마찬가지로 KaKaoProfile이라는 class를 만들어 안에 response2를 통해서 들어오는 값을 넣어주었다.
그후 받아오는 값들을 이용해 블로그에서 사용할 아이디, 이메일, 패스워드를 구성을 하였다.
이떄 블로그에 이미 아이디가 있는 User를 구분하기 위해서 if문 및 Service를 구현을 하였고
이미 아이디가 없다면 세션을 유지하기 위해서 Authentication을 활용하였다.
-> 로그인 이후에는 redirect를 통해서 index.jsp를 호출하게 해주었다.(홈페이지로 돌아간다)
Service, class등은 내용이 너무 길어지고 어려운 로직은 없기 떄문에 github를 참고하는 것을 추천한다.