OAuth 2.0 파라미터 정리 본문
728x90
암시적 그랜트 플로우
- 인가
GET /authorize?
response_type=token&
client_id=[CLIENT_ID]&
redirect_uri=[REDIRECT_URI]&
scope=[SCOPE]&
state=[STATE] HTTP/1.1
Host: server.example.com
- AccessToken
HTTP/1.1 302 Found
Location: [REDIRECT_URI]#
access_token=[ACCESS_TOKEN]&
token_type=[TOKEN_TYPE]&
expires_in=[EXPIRES_IN]&
scope=[SCOPE]&
state=[STATE]
- Error
HTTP/1.1 302 Found
Location: [REDIRECT_URI]#
error=[ERROR_CODE]&
error_description=[ERROR_DESCRIPTION]&
error_uri=[ERROR_URI]&
state=[STATE]
인가 코드 그랜트 플로우
인가 요청 → 인가 코드 응답 받기 → 액세스 토큰 요청(인가 코드 이용) → 액세스 토큰 응답으로 받기 → 액세스 토큰 파싱
- 인가
GET /authorize?
**response_type=code&**
client_id=[CLIENT_ID]&
redirect_uri=[REDIRECT_URI]& // (선택)인가 요청에 대한 응답 - 성공: 액세스 토큰, 실패 - 에러 메시지
scope=[SCOPE]& // 요청 접근 범위 (ex. 캘린더, 사진...)
state=[STATE] HTTP/1.1 // // (권장) CSRF 공격 차단, 클라이언트 요청과 그에 따른 콜백 간의 상태를 유지하기 위해 사용
Host: server.example.com
- AccessToken
& 액세스 토큰 얻는 과정
인가 코드 존재 체크 → POST 요청 만들기 → post에 인가 헤더 추가(자신의 자격 증명) → 액세스 토큰 요청 → 액세스 토큰 응답 처리 → 액세스 토큰 추출(파싱)
- HTTP 질의 파라미터에 담아 보내기 - 인가 코드를 액세스 토큰과 교환하기 위해 서버에 POST요청을 보냄. → 액세스 토큰 요청
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic [ENCODED_CLIENT_CREDENTIALS]
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code& // 액세스 토큰으로 교환하고자 한다는 것을 나타냄
code=[AUTHORIZATION_CODE]& // 인가 요청에 의해 전달받은 인가 코드 값
redirect_uri={REDIRECT_URI]& // 인가 요청에 리다이렉션 엔드포인트가 포함되면 액세스 토큰 요청에도 리다이렉션 엔드포인트 포함되야함
client_id=[CLIENT_ID]
// 클라이언트 애플리케이션은 서비스 제공자에게 자기자신을 증명해야 함
// 이는 신뢰 클라이언트의 경우 필요한 보안요소, 클라이언트 인증.
// 이를 위해 클라이언트는 자격증명을 서비스 제공자에게 안전하게 전송해야 함.
// => HTTTP 기본 인증 (OAuth 2.0 ~ 기본으로 사용)
// HTTP 헤더의 Authorization 부분에는 인증 유형을 나타내는 'Basic'과 HTTP 기본 인증 스펙에서 정의한 인코딩 방식인 Base64로 인코딩된 클라이언트 자격증명이 포함된다.
// [CLIENT_ID]:[CLIENT_SECRET]
- Error
HTTP/1.1 302 Found
Location: [REDIRECT_URI]#
error=[ERROR_CODE]&
error_description=[ERROR_DESCRIPTION]&
error_uri=[ERROR_URI]&
state=[STATE]
- 응답
// 성공
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"asdkfgjfdi12sdf", // 인가 요청 성공 의미 => 이 토큰을 이용해 사용자의 프로필과 글에 접근
"token_type": "bearer", // 전달되는 토큰의 유형
"expires_in": 3600, // (선택)토큰의 유효기간
"refresh_token": "tdkasdikwem132", // (선택) 토큰 갱신
"scope": "" // (조건부로 필수) 요청된 범위와 인가된 범위가 다르다면 이 파라미터를 통해 인가된 범위가 전달
}
액세스 토큰 이용
- API 호출
API 호출 시 액세스 토큰 전달 방법 - 아래의 방법은 bearer 토큰에만 해당
- 인가 요청 헤더 필드에 담아서 전달
GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.dismdidmJqqm // 토큰 유형 토큰 값 세팅 필요
- 인코딩된 폼의 파라미터로 전달
인가 헤더 필드를 이용하지 않고 HTTP 헤더의 다른 필드 이용
액세스 토큰을 URL 인코딩해서 POST 요청으로 전달
POST /resource HTTP/1.1
Host: server.example.com
**Content-Type: application/x-www-form-urlencoded**
access_token=mF_9.dismdidmJqqm
- URI 질의 파라미터로 전달 - 디버깅 용도. 보안 결함.
GET /resource?access_token=mF_9.dismdidmJqqm HTTP/1.1
Host: server.example.com
리프레시 토큰
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic [ENCODED_CLIENT_CREDENTIALS]
Content-Type: application/x-www.form-urlencoded
grant_type=refresh_token&refresh_token=[REFRESH_TOKEN]
'개발 > Spring' 카테고리의 다른 글
스프링 어노테이션 정리 (0) | 2021.08.12 |
---|---|
Spring profile 설정 (0) | 2021.08.12 |
OAuth 2.0 개념 정리 (0) | 2021.08.06 |
Spring Security 구조 (0) | 2021.08.06 |
단위 테스트 - @Mock @MockBean @Spy @SpyBean @InjectMocks (0) | 2021.08.06 |
Comments