Open Authorization의 약자로, 제 3의 서비스에 계정 관리를 맡기는 방식이다. ex. 네이버, 구글 로그인 연동
- OAuth 용어 정리
- 리소스 오너 (resource owner)
자신의 정보를 사용하도록 인증 서버에 허가하는 주체이다. 서비스를 이용하는 사용자가 리소스 오너에 해당 된다.
- 리소스 서버 (resource server)
리소스 오너의 정보를 가직며, 리소스 오너의 정보를 보호하는 주체이다. 네이버, 구글, 페이스북 등이 리소스 서버에 해당한다.
- 인증 서버 (authoriazation server)
클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션을 의미한다.
- 클라이언트 애플리케이션 (client application)
인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체를 의미한다.
OAuth 사용 시 인증서버에서 발급받은 토큰을 사용해서 리소스 서버에 리소스 오너의 정보를 요청하고 응답받아 사용할 수 있다.
- 리소스 오너 정보를 취득하는 4가지 방법
- 권한 부여 코드 승인 타입 (authorization code grant type)
OAuth 2.0에서 가장 잘 알려진 인증 방법이다. 클라이언트가 리소스에 접근하는 데 사용하며, 권한에 접근할 수 있는 코드와 리소스 오너에 대한 엑세스 토큰을 발급받는 방식이다.
사용자 데이터를 외부로 전달하지 않아 안전하다는 것이 가장 큰 장점이다.
cf. 구글, 카카오에서도 권한 부여 코드 승인 타입을 사용한다.
- 암시적 승인 타입 (implicit grant type)
서버가 없는 자바스크립트 웹 애플리케이션 클라이언트에서 주로 사용하는 방법이다. 클라이언트가 요청을 보내면 리소스 오너의 인증 과정 이외에는 권한 코드 교환 등의 별다른 인증 과정을 거치지 않고 액세스 토큰을 제공받는 방식이다.
- 리소스 소유자 암호 자격증명 승인 타입 (resource owner password credentials)
클라이언트의 패스워드를 이용해서 엑세스 토큰에 대한 사용자의 자격증명을 교환하는 방식이다.
- 클라이언트 자격증명 승인 타입 (client credentials grant)
클라이언트가 컨텍스트 외부에서 엑세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식이다.
사용 요청
사용자가 애플리케이션의 서비스에 접근하거나 이용을 요청한다.
권한 부여 승인 코드 요청
스프링 부트 서버(클라이언트)가 특정 사용자 데이터에 접근하기 위해 카카오, 구글 같은 서버에 요청을 보내는 것이다. 요청 URI에는 보통 클라이언트 ID, 리다이렉트 URI, 응답 타입 등을 파라미터로 보낸다.
권한 요청을 위한 파라미터 예시
GET spring-authorizationserver.example/authorize?
client_id=66a36b4c2&
redirect_uri=http://localhost:8080/myapp&
response_type=code&
scope=profile
client_id
인증 서버가 클라이언트에 할당한 고유 식별자이다. 이 값은 클라이언트 애플리케이션을 OAuth 서비스에 등록할 때 서비스에서 생성하는 값이다.
redirect_uri
로그인 성공 시 이동해야 하는 URI이다.
response_type
클라이언트가 제공받길 원하는 응답 타입이다. 인증 코드를 받을 때는 code 값을 포함해야한다.
scope
제공 받고자 하는 리소스 오너의 정보 목록이다.
로그인
인증 서버에 요청을 처음 보내는 경우 사용자에게 보이는 페이지를 로그인 페이지로 변경하고 사용자의 테이터에 접근 동의를 얻는다. 이 과정은 최초 1회만 진행된다. 이후에는 인증 서버에서 동의 내용을 저장하고 있기 때문에 로그인만 진행된다.
권한 부여 승인 코드 전달
사용자가 로그인에 성공하면 권한 요청 시에 파라미터로 보낸 redirect_uri로 리다이렉션 된다.
이때 파라미터에 인증코드를 함께 제공한다.
GET http://localhost:8080/myapp?code=a1s2f3mcj2
Access Token 요청
인증 코드를 받으면 엑세스 토큰으로 교환해야한다. 엑세스 토큰은 로그인 세션에 대한 보안 자격을 증명하는 식별 코드를 의미한다. 보통 다음과 같이 /token POST 요청을 보낸다.
POST spring-authorization-server.example.com/token
{
"client_id": "66a36bc2",
"client_secret": "aaabb11dd44",
"redirect_uri":http://localhost:8080/myapp",
"grant_type": "authorization_code",
"code": "a1b2c3d4e5f6g7h8"
}
Access Token 응답
권한 서버는 요청 값을 기반으로 유효한 정보인지 확인하고, 유효한 정보라면 아래와 같은 엑세스 토큰으로 응답한다.
{
"access_token": "aasdffb",
"token_type": "Bearer",
"ecpires_in": 3600,
"scope": "openid profile",
~ 생략 ~
}
보호된 자원 요청
제공받은 엑세스 토큰으로 사용자(리소스 오너)의 정보를 가져올 수 있다. 정보가 필요할 때마다 API 호출을 통해 정보를 가져오고 리소스 서버는 토큰이 유효한지 검사한 뒤에 응답한다.
사용자의 정보를 가져오기 위한 요청 예시
GET spring-authorization-server.example.com/userinfo
Header: Authorization: Bearer aasdffb
쿠키란 사용자가 웹사이트를 접속했을 때 웹사이트가 사용하는 서버에서 사용자의 로컬 환경에 저장하는 작은 데이터를 의미한다.
웹사이트의 방문 유무 확인, 로그인 정보 유지 등에 사용된다.
쿠키는 키와 값으로 이루어져 있고, 만료기간 도메인 등의 정보를 가지고 있다.
쿠키 형식 예시
age=23; expires=Mon, 01-Aug-2022 00:00:01 GMT; Domain=.google.com; Path=/; Secure;
HttpOnly; SameSite=None
해당 쿠키의 이름은 age 이고, 값은 23이다.
유효 시간은 2022년 8월 1일까지이다.
브라우저가 google.com 사이트의 / 폴더에 있는 어떤 웹 자원(HTML 페이지, 이미지 등)이라도 요청할 때에는 반드시 age=23 형태로 쿠키를 전송해야 한다.
Secure는 안전한 통신을 사용할 때만 이 쿠키를 전송해야한다는 의미이다.
HttpOnly는 브라우저는 HTTP로 구글 사이트와 통신하는 방법 외 어떤 경우라도 이 쿠키를 알려주어서는 안된다는 의미이다.
출처 : 황기태, ⌜명품 HTML5+CSS3+Javascript 웹 프로그래밍 (개정판) ⌟, 생능출판사, 2022, 604쪽
사용자가 어떤 웹 서버에 처음 접속할 때, 웹 서버가 다음 요청에서 그 사용자를 기억할 수 있도록 쿠키를 만들어 사용자에게 전송한다
쿠키를 받은 브라우저는 로컬 컴퓨터에 저장한다.
로컬 컴퓨터에서 동일한 웹 서버에 요청을 보낼 때 쿠키를 함께 전송한다.
쿠키를 받은 웹 서버는 어떤 사용자로부터 요청이 왔는지 식별 가능하다.
추가 참고 : 황기태, ⌜명품 HTML5+CSS3+Javascript 웹 프로그래밍 (개정판) ⌟, 생능출판사, 2022, 604쪽