OAuth란?
제 3의 서비스에 계정 관리를 맡기는 방식. 흔히 볼 수 있는 네이버로 로그인하기, 구글로 로그인하기 같은 방법임
관련 용어 정리
리소스 오너
자신의 정보를 사용하도록 인증 서버에 허가하는 주체. 서비스를 이용하는 사용자가 리소스 오너에 해당됨
리소스 서버
리소스 오너의 정보를 가지며, 리소스 오너의 정보를 보호하는 주체를 의미함. 네이버, 구글, 페이스북이 리소스 서버에 해당됨
인증서버
클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플리케이션
클라이언트 애플리케이션
인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체. 블로그를 만든다고 하면 블로그가 해당된다.
클라이언트가 리소스 오너의 정보를 취득하는 방법
권한 부여 코드 승인 타입
OAuth 2.0에서 가장 잘 알려진 인증 방법. 클라이언트가 리소스에 접근하는데 사용하며, 권한에 접근할 수 있는 코드와 리소스 오너에 대한 액세스 토큰을 발급 받는 방식
암시적 승인 타입
서버가 없는 자바스크립트 웹 애플리케이션 클라이언트에서 주로 사용하는 방법. 클라이언트가 요청을 보내면 리소스 오너의 인증 과정 이외에는 권한 코드 교환 등의 별다른 인증 과정을 거치지 않고 액세스 토큰을 제공 받는 방식
리소스 소유자 암호 자격증명 승인 타입
클라이언트의 패스워드를 이용해서 액세스 토큰에 대한 사용자의 자격증명을 교환하는 방식
클라이언트 자격증명 승인
클라이언트가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식
권한 부여 코드 승인 타입
권한부여 코드 승인 타입?
권한 요청
스프링 부트 서버가 특정 사용자 데이터에 접근하기 위해 권한 서버, 즉 카카오나 구글 권한 서버에 요청을 보내는 것
권한 요청을 위한 파라미터 예시
GET spring-authorization-server.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
제공 받고자 하는 리소스 오너의 정보 목록
데이터 접근용 권한부여
인증 서버에 요청을 처음 보내는 경우 사용자에게 보이는 페이지를 로그인 페이지로 전환하고 사용자의 데이터에 접근 동의를 얻는다. 이 과정은 최초 한번만 실행된다.
인증 코드 제공
사용자가 로그인에 성공하면 권한 요청 시에 파라미터로 보낸 redirect_uri로 리다이렉션된다. 이때 파라미터에 인증코드를 함께 제공한다
액세스 토큰 응답
인증 코드를 받으면 액세스 토큰으로 교환해야한다. 액세스 토큰은 로그인 세션에 대한 보안 자격을 증명하는 식별 코드임 아래 코드는 요청을 보내는 예시
POST spring-authorization-server.example.com/token
{
"client_id": "66a36b4c2",
"client_secret": "aabb11dd44",
"redirenct_uri": "<http://localhost:8080/myapp>",
"grant_type": "authorization_code",
"code": "a1b2c3d4e5f6g7h8"
}
client_secret
OAuth 서비스에 등록할때 제공받는 비밀 키
grant_type
권한 유형을 확인하는데 사용함. 이때는 authorization_code로 설정해야한다. 권한 서버는 요청 값을 기반으로 유효한 정보인지 확인하고 유효한 정보라면 액세스 토큰으로 응답함
아래는 예시
{
"access_token": "aasdffb",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "openid profile",
... 생략
}
액세스 토큰으로 api 응답 & 반환
이제 제공받은 액세스 토큰으로 리소스 오너의 정보를 가져올 수 있다. 정보가 필요할 때 마다 api 호출을 통해 정보를 가져오고 리소스 서버는 토큰이 유효한지 검사한 뒤에 응답한다.
쿠키
쿠키란
사용자가 어떠한 웹사이트를 방문 했을 때 해당 웹사이트의 서버에서 여러분의 로컬 환경에 저장하는 작은 데이터
이 값이 있기 때문에 이전에 방문한 적이 있는지 알 수 있고, 이 전에 로그인을 했다면 로그인 정보도 유지할 수 있다.
구성 요소
- 키
- 값
- 만료기간
- 도메인
쿠키의 추가
- 클라이언트가 정보를 요청함
- 서버에서 정보를 값으로 넣은 쿠키를 생성해서 요청한 정보 즉 HTTP 헤더와 함께 돌려 보낸다.
- 클라이언트는 브라우저에 쿠키를 저장함
이후 사이트에 재 방문할때는 사용자가 로컬 환경에 있는 쿠키와 함께 서버에 요청함 이렇게 하면 클라이언트에 값을 저장할 수 있기 때문에 현재 사용자 관련 정보를 보여줄 수 있다.
'Spring, Spring boot' 카테고리의 다른 글
일정관리프로그램 만들어보기 (0) | 2024.03.05 |
---|---|
토큰 기반 인증방식 feat.JWT (1) | 2024.01.16 |
스프링 시큐리티 config (0) | 2024.01.10 |
템플릿엔진 - 타임리프 (0) | 2024.01.04 |
TIL (1) | 2024.01.03 |