OAuth란?
- 제 3의 서비스에 계정 관리를 맡기는 방식
- 네이버로 로그인하기, 구글로 로그인하기, 페이스북으로 로그인하기...
용어
- 리소스 오너(resource owner): 자신의 정보를 사용하도록 인증 서버에 허가하는 주체로, 서비스를 이용하는 사용자가 해당
- 리소스 서버(resource server): 리소스 오너의 정보를 가지며 보호하는 주체를 의미. 네이버, 구글, 페이스북이 리소스 서버에 해당
- 인증 서버(authorization server): 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할
- 클라이언트 애플리케이션(client application): 인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체로, 지금 만들고 있는 서비스가 해당
권한 부여 코드 승인 타입
- OAuth에서 가장 잘 알려진 인증 방법으로 구글, 카카오도 사용 중
- 권한 요청은 클라이언트가 특정 사용자 데이터에 접근하기 위해 권한 서버에 요청을 보내는 것
- 클라이언트 ID, 리다이렉트 URL, 응답 타입 등을 파라미터로 보냄
권한 요청 파라미터 예시
GET spring-authorization-server.example/authorize?
client_id=..... // 인증 서버가 클라이언트에 할당한 고유 식별자. Oauth 서비스에 등록할 때 서비스에서 생성하는 값
redirect_uri=http://localhost:8080/myapp& // 로그인 성공시 이동해야 하는 URI
resource_type=code& // 클라이언트가 제공받길 원하는 응답 타입으로, 코드를 받을 때는 code 값을 포함해야 함
scope=profile // 제공받고자 하는 리소스 오너의 정보 목록
데이터 접근 권한 부여
- 인증 서버에 요청을 처음 보내는 경우 사용자에게 보이는 페이지를 로그인 페이지로 변경하여 사용자 데이터에 접근 동의 얻음(최초 1회)
- 이후에는 인증 서버에서 동의 내용을 저장하고 있기 때문에 로그인만 진행
- 로그인 성공 시 권한 부여 서버는 데이터에 접근 가능하게 인증 및 권한 부여를 수신
인증 코드 제공
- 사용자가 로그인에 성공 시 권한 요청 파라미터로 보낸 redirect_uri로 리다이렉션되는데, 이때 파라미터에 인증 코드 제공
GET http://localhost:8080/myapp?code=a23dfbsfd213
- 인증 코드를 받으면 액세스 토큰(로그인 세션에 대한 보안 자격을 증명하는 식별 코드)으로 교환하여야 함
POST spring-authorization-server.example.com/token
{
"client_id": .......,
"client_secret": ......., // OAuth 서비스에 등록할 때 제공받는 비밀키
"redirect_uri": "http://localhost:8080/myapp",
"grant_type": "authorization_code", // 권한 유형 확인할 때 사용. 유효한 정보인지 확인하고 액세스 토큰으로 응답
"code": .......
}
액세스 토큰 응답 예시
{
"access_token": .....,
"token_type": "Bearer",
"expires_in": 3600,
"scope": "openid profile",
...
}
이때 제공받은 액세스 토큰으로 리소스 오너의 정보를 가져올 수 있음
정보가 필요할 때 API 호출을 통해 정보를 가져오고 리소스 서버는 토큰이 유효한지 검사한 뒤에 응답
리소스 오너의 정보를 가져오기 위한 요청 예시
GET spring-authorization-resource-server.example.com/userinfo
Header: Authorization: Bearer .....
참고
- 스프링 부트3 백엔드 개발자 되기(자바 편)
'ETC' 카테고리의 다른 글
SEO(검색 엔진 최적화)란? (2) | 2023.11.08 |
---|---|
HTTP 상태 코드 (0) | 2023.11.04 |
VSCode - rest client (0) | 2023.08.31 |
모노레포(Monorepo) (0) | 2023.07.12 |
CSP, MSP 차이 (0) | 2023.05.08 |