인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

PrivilegeEscalate님의 프로필 이미지

작성한 질문수

스프링 시큐리티 OAuth2

Authorization Code Grant Type - 권한 부여 코드 승인 방식

RFC 문서에서의 AccessToken 발급 방식 궁금한점

작성

·

70

·

수정됨

0

강사님 안녕하세요. 진짜 오랜만에 질문드립니다.

 

다름이 아니라 제가 Authorization Code Grant 방식에서의 OAuth2 인증 인가 프로세스를 RFC 문서에서 읽고 있었습니다.

 

https://datatracker.ietf.org/doc/html/rfc6749#section-4.1

에 따르면,

(E) The authorization server authenticates the client, validates the authorization code, and ensures that the redirection URI received matches the URI used to redirect the client in step (C). If valid, the authorization server responds back with an access token and, optionally, a refresh token.

 

(E) 인증 서버는 클라이언트를 인증하고, 인가 코드(authorization code)의 유효성을 검사하며, (C) 단계에서 클라이언트를 리다이렉션할 때 사용된 리디렉션 URI가 받은 URI와 일치하는지 확인합니다. 만약 유효하다면, 인증 서버는 액세스 토큰(access token)과 선택적으로 리프레시 토큰(refresh token)을 응답으로 반환합니다.

 

라고 나와있습니다. 즉, AccessToken 을 요청할때 Http Body 에 명시하는 redirect_uri 주소가, Authorization Code 를 발급할 때 사용한 redirect_uri 와 같으면 이를 유효한 요청이라 판단하고, AccessToken 을 내려준다고 나와있는데요.

 

근데 우리의 Application. 즉, Client 가 React 와 Spring 으로 나누어진 환경이며, 인가코드 발급은 Front, 나머지는 Back 이 담당한다고 한다면.

 

  1. Frontend 가 Authroization Code 를 발급받고(redirect uri 는 Front 주소) 인가코드를 가지고 Backend 의 특정 Endpoint 에 요청을 찌른다.

 

  1. Backend 가 그 Authroization Code 를 받고, RestTemplate 로 token uri 주소로 code&redierct_uri(백엔드 redirect uri) 등등을 body 에 명시하여 넘길텐데..

 

인가서버는 어떻게 엑세스토큰을 내려주는건가요?

분명 Frontend 가 Authorization Code 를 발급받을때는 redirecturi 가 Frontend 주소였을테고, Backend 가 AccessToken 을 요청할때 사용된 redirecturi 는 Backend 주소일텐데.. 좀 궁금합니다.

 

OAuth2 Provider 마다 다른걸까요? 많은 블로그에서는 제가 적은 프로세스대로 구현한다고 나와있어 의문점이 들었습니다.

 

우선 현재는 Spring OAuth2 모듈을 사용하지 않고, 프로젝트 경량화를 위해 OAuth2 Client 모듈이 수행하는 과정을 백엔드에서 직접 모두 구현하여 처리하는 흐름으로 구현해놓긴 했습니다.

답변 1

1

정수원님의 프로필 이미지
정수원
지식공유자

서버에서는 리다이엑트 URI 를 여러개 설정할 수 있긴 합니다.

그리고 Authorization Code를 요청할 때는 Frontend(클라이언트)에서 인증 서버에 전달한 redirecturi 가, 인증 서버에 사전 등록된 redirecturi 중 하나와 정확히 일치해야 하는 건 맞지만 토큰 발급은 강제하지 않는 것으로 알고 있습니다.

인가서버마다 표준 문서를 엄격하게 따르기도 하지만 어느 정도 유연하게 설계하기도 합니다.

PrivilegeEscalate님의 프로필 이미지

오 빛보다 빠른 답변 감사합니다. 강사님 말씀은 인가코드를 요청할때 명시하는 redirect_uri 주소를 검증할때는 인가서버에 등록된 redirect_uri 인지 검사하고,

 

AccessToken 을 요청할때 명시하는 redirect_uri 는 "원래라면 인가코드를 요청할때 명시한 redirect_uri 와 같아야 하지만", 인가서버마다 유연하게 처리하기 때문에, 꼭 같을 필요는 없다. 단, AccessToken 을 요청할때 명시하는 redirect_uri 도 인가서버에 등록되어있는지는 확인한다.

 

라고 이해하면 되는걸까요?!!!

정수원님의 프로필 이미지
정수원
지식공유자

스프링에서는 제 기억에 체크하지

않았던것 같던데 최신버전에서는 잘 모르겠습니다

아마 인증코드 발급과정에서 이미 확인했기 때문에 토큰발급과정에서 이중체크까지는 필요없을 수도 있겠다 정도입니다

토큰발급과정이 클라이언트에서 서버로 즉시 리다이렉트 요청하기 때문에 중간에서 클라이언트가 변경될 가능성이 크지 않을 수도 있어서 아주 엄격하게 다시 재 검사를 하지 않는 것 같습니다

이건 저 개인 생각입니다

PrivilegeEscalate님의 프로필 이미지

그렇군요! 전문가분도 그렇게 생각하시니.. 그냥 넘어가야하는 부분인가봅니다. 답변 감사합니다. 좋은 하루 보내세요!