본문 바로가기

공부/Spring

스프링 부트 3 백엔드 개발자 되기_21

10장

OAuth2로 로그인/로그아웃 구현하기
OAuth는 제3의 서비스에 계정 관리를 맡기는 방식
ex)네이버로 로그인하기, 구글로 로그인하기

관련 용어 정리 

리소스 오너: 자신의 정보를 사용하도록 인증 서버에 허가하는 주체, 서비스를 이용하는 사용자가 리소스 오너에 해당
리소스 서버: 리소스 오너의 정보를 가지며 리소스 오너의 정보를 보호하는 주체를 의미, 네이버,구글,페이스북이 리소스 서버에 해당
인증 서버: 클라이언트에게 리소스 오너의 정보에 접근할 수 있는 토큰을 발급하는 역할을 하는 애플레케이션을 의미
클라이언트 애플리케이션: 인증 서버에게 인증을 받고 리소스 오너의 리소스를 사용하는 주체를 의미, 지금 만들고 있는 서비스가 이에 해당



클라이언트가 리소스 오너 정보를 취득할 수 있는 방법은 4가지다.
1.권한 부여 코드 승인 타입
  클라이언트가 리소스에 접근하는 데 사용, 권한에 접근할 수 있는 코드와 리소스 오너에 대한 액세스 토큰을 발급하는 방식
2.암시적 승인 타입
  서버가 없는 클라이언트에서 주로 사용하는 방법, 클라이언트가 요청을 보내면 리소스 오너의 인증 과정 이외에는 권한 코드 교환 등의 별다른 인증 과정을 거치지 않고 액세스 토큰을 제공받는 방식
3. 리소스 소유자 암호 자격증명 승인 타입
  클라이언트의 패스워드를 이용해서 액세스 토큰에 대한 사용자의 자격 증명을 교환하는 방식
4.클라이언트 자격증명 승인 타입
  클라이언트가 컨텍스트 외부에서 액세스 토큰을 얻어 특정 리소스에 접근을 요청할 때 사용하는 방식
  
  
  
##여기서는 1.권한부여 코드 승인 타입을 중심으로 설명하겠다



권한 부여 코드 승인 타입이란?
이 방식 이해를 위해선 인증 순서가 어떻게 되는지 알아야 함


1.리소스 오너가 애플리케이션에 권한 요청
2.리소스 서버가 리소스 오너에게 데이터 접근용 권한 부여
3.애플리케이션이 인증서버에 인증코드 발급
4.애플리케이션이 인증서버에 액세스 토큰으로 발급
5.에플리케이션이 리소스 서버에 액세스 토큰으로 데이터에 접근 


권한요청이란?
클라이언트 즉 스프링 부트 서버가 특정 사용자 데이터에 접근하기 위해 권한 서버(카카오나 구글)에 요청을 보내는 것
요청 URI는 권한 서버마다 다르지만 보통은 클라이언트ID, 리다이렉트URI 응답 타입 등을 파라미터로 보냄



권한 요청을 위한 파라미터 예

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 
제공받고자 하는 리소스 오너의 정보 목록 




데이터 접근용 권한 부여
인증 서버에 요청을 처음 보내는 경우 사용자에게 보이는 페이지를 로그인 페이지로 변경하고 사용자의 데이터에 접근 동의를 얻음
이 과정은 최초 1회만 진행, 이후에는 인증 서버에서 동의 내용을 저장하고 있기 때문에 로그인만 진행
로그인 성공시 권한 부여 서버는 데이터에 접근할 수 있게 인증 및 권한 부여를 수신

인증 코드 제공
사용자가 로그인에 성공하면 권한 요청 시에 파라미터로 보낸 redirect_uri로 리다이렉션됩니다.
이때 파라미터에 인증코드를 함께 제공


인증 코드의 예
GET http://localhost:8080/myapp?code=a1s2f3mcj2


액세스 토큰 응답이란?
인증 코드를 받으면 액세스 토큰으로 교환해야 함
액세스 토큰은 로그인 세선에 대한 보안 자격을 증명하는 식별 코드를 의미함
보통 다음과 같이 /token POST 요청을 보냄





/token POST 요청 예시

POST spring-authorization-server.example/com/token
{
 "client_id":"66a36b4c2&",
 "client_secret":"aabb11dd44",
 "redirect_uri":"http://localhost:8080/myapp",
 "grant_type":"authorization_code",
 "code":"a1b2c3d4e5f6g7h8"
}


client_secret:
OAuth 서비스에 등록할 때 제공받는 비밀키 

grant_type:
권한 유형 확인하는 데 사용
이땐 authorization_code로 설정해야 함
권한 서버는 요청 값을 기반으로 유효한 정보인지 확인 후 유효한 정보라면 액세스 토큰을 응답



액세스 토큰으로 API응답&반환
제공받은 액세스 토큰으로 리소스 오너의 정보를 가져올 수 있었습니다.
정보가 필요할 때마다 API호출을 통해 정보를 가져오고 리소스 서버는 토큰이 유효한지 검사한 뒤에 응답

리소스 오너의 정보를 가져오기 위한 요청의 예
GET spring-authorization-resource-server.example/userinfo
Header: Authorization: Bearer aasdffb

-----------------> 여기까지가 권한 부여 코드 승인 타입의 흐름
대부분 OAuth를 구현한 라이브러리는 이 흐름을 바탕으로 코드를 구현



쿠키란?
사용자가 어떤 웹 사이트를 방문했을 때 웹사이트가 사용하는 서버에서 로컬 환경에 저장하는 작은 데이터
쿠키는 키와 값으로 이루어져 있고 만료기간, 도메인 등의 정보를 가지고 있다.
HTTP 요청을 통해 쿠키의 특정 키에 값을 추가 가능

쿠키는 다음과 같은 과정으로 추가됨

1.브라우저에서 요청
2.서버에서 쿠키 설정
3.브라우저에 쿠키 저장 
4.
GET /members
Cookie:member_id=1


클라이언트가 정보를 요청하면 서버에서 정보를 값으로 넣은 쿠키를 생성해서 요청한 정보 즉 HTTP 헤더와 함께 돌려 보냄 
그러면 클라이언트는 로컬 즉 브라우저에 쿠키를 저장
이후 사이트에 재방문시 사용자가 로컬 환경에 있는 쿠키와 함께 서버에 요청함
이렇게 하면 클라이언트에 값을 저장할 수 있기 때문에 현재 사용자에 관련된 정보를 보여줄 수 있음



#쿠키 관리 클래스 구현하기
OAuth2로 인증 플로우를 구현하며 쿠키를 사용할 일이 생기는데 그때마다 쿠키를 생성하고 삭제하는 로직을 추가하면 불편하므로 유틸리티로 사용할 쿠키 관리 클래스를 미리 구현해 두는게 좋음


274pg 생성자 새로 추가하는게 아니라 원래있던거 살짝 수정하는거니까 착각하지 말자