-
[SpringSecurity] OAuth 개념 정리Spring 2021. 12. 30. 23:01
SpringSecurity를 이용하여 Oauth2 로그인을 구현 도중 공부한 내용에 대해서 정리를 하기 위해 포스팅을 작성하였습ㅈ니다.
1. Oauth 란?
간단하게 인증(Authentication)과 권한(Authorization)을 획득하는 것으로 볼 수 있습니다.
구글, 페이스북, 카카오 등에서 제공하는 Authorization Server를 통해 회원 정보를 인증하고, Access Token을 발급받아 타사의 API 서비스를 이용할 수 있습니다.
2. Oauth의 배경
third party Application에 아이디와 비밀번호를 제공하고 싶지 않은 요구가 급증하였습니다.
개인정보를 여러 곳에 입력하면 피싱에 노출되고 무엇보다 해당 Application이 안전하다는 보장이 없기 떄문에 보안에 취약했다. 당시에는 인증과 권한을 부여하는 요구를 만족 시킬 수 있는 Twitter 주도의 OAuth 1.0이 탄생하였습니다.
- oAuth1.0은 ... 구현이 복잡하고 웹이 아닌 어플리케이션에서의 지원이 부족하고, 인증토큰(access token)이 만료되지 않는 단점이 있었습니다...
3. Oauth2.0 이 되면서 ...
- 기능의 단순화, 기능과 규모의 확장성 등을 지원하기 위해 제작.
- 1.0a는 만들어진 다음 표준이 된 반면 2.0은 처음부터 표준 프로세스로 배포.
- 암호화는 https에 책임전달.
- api서버에서 인증서버를 분리 할 수 있도록 구성.
4. OAuth2 인증 프로세스
발급받은 Access Token은 서비스에서 자체적으로 저장, 관리해야합니다.
5. Token
Access Token
앞서 말한 4가지 권한 요청 방식 모두, 요청 절차를 정상적으로 마치면 클라이언트에게 Access Token이 발급됩니다. 이 토큰은 보호된 리소스에 접근할 때 권한 확인용으로 사용됩니다. 문자열 형태이며 클라이언트에 발급된 권한을 대변하게 됩니다. 계정 아이디와 비밀번호 등 계정 인증에 필요한 형태들을 이 토큰 하나로 표현함으로써, 리소스 서버는 여러 가지 인증 방식에 각각 대응 하지 않아도 권한을 확인 할 수 있게 됩니다.
Refresh Token
한번 발급받은 Access Token 은 사용할 수 있는 시간이 제한되어 있습니다. 사용하고 있던 Access Token 이 유효기간 종료 등으로 만료되면, 새로운 액세스 토큰을 얻어야 하는데 그때 이 Refresh Token 이 활용됩니다. 권한 서버가 Access Token 을 발급해주는 시점에 Refresh Token 도 함께 발급하여 클라이언트에게 알려주기 때문에, 전용 발급 절차 없이 Refresh Token을 미리 가지고 있을 수 있습니다. 토큰의 형태는 Access Token과 동일하게 문자열 형태입니다. 단 권한 서버에서만 활용되며 리소스 서버에는 전송되지 않습니다.
토큰의 갱신 과정
클라이언트가 권한 증서를 가지고 권한서버에 Access Token 을 요청하면, 권한 서버는 Access Token과 Refresh Token 을 함께 클라이언트에 알려줍니다. 그 후 클라이언트는 Access Token을 사용하여 리소스 서버에 각종 필요한 리소스들을 요청하는 과정을 반복합니다. 그러다가 일정한 시간이 흐른 후 액세스 토큰이 만료되면, 리소스 서버는 이후 요청들에 대해 정상 결과 대신 오류를 응답하게 됩니다. 오류 등으로 액세스 토큰이 만료됨을 알아챈 클라이언트는, 전에 받아 두었던 Refresh Token을 권한 서버에 보내어 새로운 액세스 토큰을 요청합니다. 갱신 요청을 받은 권한 서버는 Refresh Token 의 유효성을 검증한 후, 문제가 없다면 새로운 액세스 토큰을 발급해줍니다. 이 과정에서 옵션에 따라 Refresh Token 도 새롭게 발급 될 수 있습니다.
'Spring' 카테고리의 다른 글
[SpringSecurity] 도메인이 다를경우, antMatchers 권한 처리 방법. (0) 2022.03.15 [SpringSecurity] OAuth2.0 ... Authorization Code Grant 인증 (0) 2021.12.31 [Spring] 스프링 빈은 무조건 Thread-safe 할까? (0) 2021.12.23