알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

Spring Security OAuth2 Login lib 사용기 본문

Web /Spring Framework tip

Spring Security OAuth2 Login lib 사용기

백곳 2020. 10. 27. 13:56

삽질 과정을 최대한 줄이려고 노력 했지만 영상 중간 중간에 삽질 과정이 들어가는군요 ... 

 

해당 부분은 제가 oAuth2 Login lib가 어떤것인지 알아보고 이해하고 찍은 동영상 입니다. 

 

www.youtube.com/watch?v=3niJTyBUIPI

 

일단 OAuth2 Login의 테스트가 될 서버의 상태를 먼저 본뒤에 Login Lib 를 사용해 보겠습니다.

http://10.20.10.114:8080/fAuth/#/login?clientId=TestAuth&redirectUri=http%3A%2F%2Flocalhost%3A8181%2Fresource%2FTEST2&scope=message.read%20message.write&state=123

 

이렇게 추가 적으로 OAuth2 에 필요한 정보를 주면

 

인증 완료후 http://localhost:8181/resource/TEST2?code=GNTFqN&state=123

같이 code state 를 함께 넘겨 받도록 됩니다.

 

이 과정을 다시 보면 제가 해당 서버에 

인증 완료뒤에

http://10.20.10.114:8080/auth/oauth/authorize?client_id=TestAuth&redirect_uri=http://localhost:8181/resource/TEST2&response_type=code&scope=message.read%20message.write&state=123

위에 URL 리디렉션을 해주고 해당 URL 에서는

http://localhost:8181/resource/TEST2?code=GNTFqN&state=123

 로 리디렉션을 해주게 됩니다.

 

그렇게 해서 실제로 사용할 서버에 http://localhost:8181/resource/TEST2 요청이 파라메터와 같이

들어 옵니다.

 

일단 Oauth2 로그인 서버의 상황은 지금과 같습니다.

 

모두 허용을 해주고

왜나하면 라이브러리 사용시 해당 부분은 인증하는 과정중에 접근이 필요 하기 때문입니다.

여기서 /TEST2 라고 해준 부분이 있는데

redirect_uri=http://localhost:8181/resource/TEST2 이거 이기 때문에

/TEST2 에 들어 올 때 Oauth2 로그인 시작 과정임을 알아야 되기 때문입니다.

현재 리소스와 포트는 위와 같이 설정 해 두었습니다.

중요한 부분은 ClientRegistrationRepository 이부분 입니다.

여기서 인증에 필요한 데이터를 입력해 저장해 놓기 때문입니다.

현재는 인메모리 레포지토리에 저장 했습니다.

 

위와 같이 적히고 \

일부러 2개를 저장 했습니다.

자 그리고 인증이 필요한

테스트1 에 접근해 보겠습니다.

일부러 크롬을 끄고 켜서 세션을 변경 하겠습니다. 아까 인증한 정보가 남아 있기 때문에 세션을 테스트를 위해서 바꿔줄 필요가 있습니다.

현재는 인증이 안된 상태 입니다.

 

자 여기에 보면 인증 이 안되서 Oauth2 가 기본으로 지원하는 사이트에 들어 왔습니다.

설정으로 해당 페이지를 커스텀마이징 할수 있지만 일단 기본을 사용했습니다.

 

그럼 저 2개는

여기

여기

2개 입니다.

그리고 로그인을 누르게 되면

일단 http://localhost:8181/resource/oauth2/authorization/auth 들어가 되면

스프링 Oauth2 Login 에서 리디렉션을 합니다.

http://10.20.10.114:8080/auth/oauth/authorize?response_type=code&client_id=TestAuth&scope=message.read%20message.write&state=grQy_v61Z9wBq5d8FesDE9CpYokoHys5Cpv5yyI2hVo%3D&redirect_uri=http://localhost:8181/resource/TEST2

위와 같이 code 얻기 위한 URL

해당 정보를 기반으로 만들어 줍니다.

하지만 http://10.20.10.114:8080/auth 아직 로그인 안되어 있고 인증이 필요하기에

다시 로그인 페이지로 리디렉션 됩니다.

원래 여기서 http://10.20.10.114:8080/fAuth/

아니라

http://10.20.10.114:8080/fAuth/#/login?clientId=TestAuth&redirectUri=http%3A%2F%2Flocalhost%3A8181%2Fresource%2FTEST2&scope=message.read%20message.write&state=123

여기로 리디렉션을 해줘야 하지만 코딩을 안해 두었기 때문에 일단 저렇게 움직이도록 코딩 되어 있습니다.

http://10.20.10.114:8080/fAuth/#/login 여기서 로그인 하면 리디렉션만 하지 않지 로그인 인증

은 되도록 해 놨으므로 일단 인증 되었습니다.

http://10.20.10.114:8080/fAuth/ 에 인증이 되고

위와 같이 Oauth2 Login이 실행 시켜

Code를 얻어 오고

요청 했던 곳으로 리디렉션 해줍니다.

원 요청 페이지로 리디렉션 하기 전에 숨은 과정이 있습니다.

숨은 과정은 나중에 좀더 보고

일단 만약에 인증서버에 로그인이 되어 있다면

경우를 보겠습니다.

여기서 error authorization_request_not_found]  

가 뜨는 이유는

로그인 후에 어쨋던 redirection 때문에

http://localhost:8181/resource/TEST2?code=Hdxymd&state=123

에 가게 되는데

여기서 우리는 현재 가지고 있는 세션으로는 이전에 인증이 필요한 요청 을 한

이력이 없기 때문에 리디렉션 할곳이 없다는 에러로 받아 들였습니다.

만약 이전 요청이 있는 경우라면

현재가 이전 요청 TEST1 이 있는 경우 입니다.

자 다음과 같이 오류가 나지 않게 됩니다.

인증 이 서버에서 로그인을 위해서 필요한 부분이 또 있습니다.

이부분에서

http://10.20.10.114:8080/auth/getMe

저는 이부분에서 Access Token 을 통해서 유저 정보를 얻어 오는 부분이 작성 되어 있습니다.

여기가 제 인증 서버 입니다.

리소스 서버로도 설정 하여 사용 중인 사항 입니다.

현재 저 서버가 뛰어 져있는 곳은 10.20.10.114:8080/auth 입니다.

 

여기 어트리뷰트 쪽에 아까의 데이터가 Map 형식으로 들어 옵니다.

여기서 아까 받았던 Code를 통해서 Access Token 을 얻어 오게 됩니다/

 

 

그리고

여기서 유저 정보를 요청 해서 같이 넣어 줍니다.

여기서 중요한 것은 응답 받는 json 형식의 데이터에서 sub 이라는 항목이 꼭 있어야 됩니다.

내용은 일단 아무거나 적어도 상관은 없었습니다.

만약 sub 항목이 없으면 에러가 납니다.

그리고 이렇게 인증된 객체가 들어 옵니다.

여기서 알수 있는건 oauth2의 로그인이 해당 서버의 로그인 처럼 사용 된다는것이죠.

처음에 auth링크를 누를 때 세션과 매칭 시켜 access token refresh token

메모리에 저장 합니다.

 

 

 

 

Comments