Spring Security & JWT를 이용한 자체 Login & OAuth2 Login(네이버, 카카오) 구현 (4) - OAuth 개념 및 사전 설정

오형상·2024년 9월 20일
0

CoinToZ

목록 보기
4/9
post-thumbnail

OAuth 2.0 로그인: 왜 필요할까요?

온라인 서비스의 사용자 인증 및 권한 부여의 문제점

온라인 서비스가 발전함에 따라 사용자 인증과 권한 부여는 중요한 이슈가 되었습니다. 전통적으로 사용자 이름과 비밀번호를 통해 인증하는 방식은 아래와 같은 문제를 가지고 있어요.

  1. 보안 위험성: 비밀번호는 쉽게 유출될 수 있으며, 보안상 취약합니다.
  2. 사용자 편의성 저하: 매번 아이디와 비밀번호를 입력하는 것은 불편합니다. OAuth 로그인을 경험한 사용자는 클릭 한 번으로 로그인할 수 있는 간편함을 선호합니다.
  3. 제3자 서비스 통합의 어려움: 다른 서비스와 데이터를 공유하거나 로그인 통합이 어려울 수 있습니다.

OAuth 2.0이 이러한 문제를 어떻게 해결할까요?

  1. 보안 강화: OAuth 2.0은 사용자가 비밀번호를 직접 제공하지 않고, 토큰을 통해 안전하게 데이터를 전송합니다.
  2. 사용자 경험 향상: 이미 로그인한 상태에서 다른 서비스로 쉽게 이동할 수 있습니다.
  3. 제3자 서비스 통합 용이성: OAuth 2.0은 표준화된 방식으로 서비스를 쉽게 통합하고 연동할 수 있습니다.

이러한 이유로 OAuth 2.0은 현대 웹 및 앱 개발에서 필수적인 인증 및 권한 관리 방식으로 자리 잡았습니다.


OAuth 2.0 정의

OAuth란 무엇인가요?

OAuth는 'Open Authorization'의 약자로, 비밀번호를 제공하지 않고도 웹사이트나 애플리케이션이 사용자의 데이터에 접근할 수 있도록 하는 개방형 표준입니다.

2010년 IETF에서 발표된 OAuth 1.0을 시작으로, 현재는 그 문제점을 보완한 OAuth 2.0이 널리 사용되고 있습니다.

OAuth의 주요 역할

  1. 인증 및 인가: 사용자가 서비스에 접근할 권한을 부여하는 프로세스를 관리합니다.
  2. 토큰 발급: 사용자 인증 후 접근 권한을 나타내는 토큰을 발급합니다.
  3. 보호된 리소스에 접근: 발급된 토큰을 사용하여 사용자의 데이터나 서비스에 안전하게 접근합니다.

즉, 사용자는 비밀번호 없이 접근 권한을 위임하고, 로그인 및 정보 관리를 제3자 애플리케이션(구글, 네이버 등)에 맡길 수 있습니다.


OAuth 2.0의 주요 특징 및 이점

  1. 간편한 구현: 다양한 플랫폼과 언어에서 지원되며, 비교적 쉽게 구현할 수 있습니다.
  2. 보안 강화: 토큰 기반 인증으로 사용자 데이터를 안전하게 보호합니다.
  3. 사용자 경험 향상: 사용자는 로그인할 때 자격 증명을 반복해서 입력하지 않아도 됩니다.
  4. 제3자 애플리케이션 지원: 다양한 애플리케이션이 손쉽게 서비스와 통합될 수 있습니다.

OAuth 구성 요소


OAuth 로그인 과정

OAuth 2.0 로그인 프로세스는 다음과 같은 단계로 이루어집니다.

1 ~ 2. 로그인 요청

사용자(Resource Owner)가 우리 서비스의 'SNS로 로그인하기' 등의 버튼을 클릭하면 클라이언트(Client)는 OAuth 프로세스를 시작하기 위해 사용자의 브라우저를 Authorization Server로 보내야 해요.

클라이언트는 Authorization Server가 제공하는 Authorization URL에 response_type, client_id, redirect_uri, scope 등의 매개변수를 쿼리 스트링으로 포함하여 보내야 해요.

다음과 같이 정해진 규칙이 있어요. 하지만 Third-Party Application에 따라 방식이 다르긴 해요.

  • response_type : 반드시 code 로 값을 설정해야한다. 인증이 성공하면 클라이언트는 나중에 사용 할 Authorization Code를 받게 되요.
  • client_id : Third-Party Application에 애플리케이션 생성했을 때 발급받은 Client ID
  • redirect_uri : Third-Party Application에 애플리케이션 생성할 때 등록한 Redirect URI
  • scope : Resource Server에서 사전에 사용 가능하도록 미리 정의한 기능
&client_id=29352735982374239857
&redirect_uri=https://example-app.com/callback
&scope=create+delete

3 ~ 4. 로그인 페이지 제공, ID/PW 제공

Resource Owner가 클라이언트가 빌드한 Authorization URL로 이동해요. 로그인 페이지에서 사용자가의 sns 아이디와 비밀번호 등을 입력하여 인증해요.

5 ~ 6. Authorization Code 발급, Redirect URI로 리디렉트

인증이 성공하면, Authorization Server는 제공된 Redirect URI로 사용자를 리디렉션 하게 만들어요. 이때, Redirect URI에 Authorization Code를 포함하고 있어요.

이때, Authorization Code는 Client가 Access Token을 획득하기 위해 사용하는 임시 코드에요. 이 코드의 수명은 일반적으로 1~10분 정도로 굉장히 짧아요.

7 ~ 8. Authorization Code와 Access Token 교환

Client는 Authorization Code를 Authorization Server에 전달하면, Access Token을 응답받아요. Client는 발급받은 Resource Owner의 Access Token을 저장하고, 이후 Resource Server에서 Resource Owner의 리소스에 접근하기 위해 Access Token을 사용하게 되요.

❗️ Access Token은 유출되어서는 안 되므로 HTTPS 연결을 통해서만 사용해야 해요. Authorization Code와 Access Token 교환은 token 엔드포인트에서 이뤄지고 있어요.

필수로 전달해야 하는 매개변수는 다음과 같습니다.

  • grant_type: 항상 “authorization_code”에요.
  • code: 로그인 인증 요청 API 호출에 성공하고 리턴받은 인증코드값
  • redirect_uri: Redirect URI
  • client_id: Client ID
  • client_secret: RFC 표준상 필수는 아니지만, Client Secret이 발급된 경우 포함하여 요청해야 합니다.

9. 로그인 성공

위 과정을 성공적으로 마치면 Client는 Resource Owner에게 로그인이 성공하였음을 알리면 되요.

10 ~ 13. Access Token으로 리소스 접근

이후, Resource Owner가 Resource Server의 리소스가 필요한 기능을 Client에 요청해요. Client는 위 과정에서 발급받은 Access Token을 사용하여 제한된 리소스에 접근하고, Resource Owner에게 자사의 서비스를 제공할 수 있게 되요.


카카오 OAuth 설정

카카오 애플리케이션을 등록하기 위해 Kakao Developers로 이동합니다.

1. 애플리케이션 추가

2. REST API 키 확인

이제 로그인 구현하는데 필요한 정보들을 가져와야하는데 우리가 카카오 서버로 요청을 보낼때
GET /oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code 이런식으로 보내야해서 필요한 REST_API_KEY 와 REDIRECT_URI을 가져와야합니다.

앱 설정에 앱 키 항목에 들어가 REST API키를 Client_id로 사용할 겁니다.

3. web 등록 및 Redirect URI 등록

여기까지 진행했다면 위에 Oauth2.0 로그인 과정에서 6번까지 완료한 상태입니다.
이제 Oauth2.0 프로세스의 7번을 하기위해 토큰을 요청하고 받아와야합니다.
카카오에서는 REST_API_KEY , REDIRECT_URL, 인가코드들만으로도 토큰을 받을수도 있지만 토큰을 발급할때 좀 더 보안을 강화하기 위해 Client Secret을 받아봅시다.

Client Secret 발급

Client Secret을 받는 위치는 내 애플리케이션 -> 제품 설정 -> 카카오로그인 -> 보안 입니다.
Client Secret을 받고난후 밑에 활성화 상태를 사용함으로 변경해주어야합니다.

동의항목 설정

자신의 상황에 맞춰 동의항목을 설정하면 됩니다.


네이버 OAuth 설정

애플리케이션 등록을 위해 네이버 개발자 센터로 이동합니다.

애플리케이션 등록

네이버에서는 client_id, redirect_uri, response_type, state 파라미터를 사용해서 네이버 로그인 페이지 URL 을 만들어요.

client_id는 애플리케이션이 등록 후 확인 할 수 있으니 여기서는 동의항목과 서비스 url과 redirect_url만 설정해주면 됩니다.

인가정보 확인

?response_type=code
&client_id=MyHoVO2X8kk7l9O3xpjF
&state=test
&redirect_uri=http://localhost:8080/naver/callback

마무리

다음 편에는 스프링 시큐리티와 java와 springboot를 활용해 코드 구현 과정을 포스팅하겠습니다.

Reference

0개의 댓글