라라벨 API를 만들어보면서 패스포트를 알게 되었는데, 진행이 안돼서 개념부터 차근차근 정리해보려고 합니다.
1. OAuth 2.0
OAuth는 다른 서비스의 회원 정보를 안전하게 사용하기 위한 방법입니다. (편하게 2.0을 생략하겠음)
쇼핑을 사용하다 보면 물건을 사기 위해 구글로 로그인을 해야하거나 네이버 로그인을 해야 할 일이 필요한 경우가 있을 것입니다, 그것이 OAuth 입니다.
즉 다른 서비스의 정보를(구글, 네이버) 해당 사이트에(쇼핑 사이트)에 토큰을 통해 안전하게 넘기는 방법입니다.
OAuth는 토큰을 통해 안전하게 데이터를 넘길 수 있기 때문에 RESTful API에서 가장 많이 쓰이는 인증 시스템입니다.
API에서 인증은 브라우저에서 세션을 통해 자동 로그인을 해주는 세션 기반 인증을 할 수 없습니다.
왜냐하면 RESTful는 상태를 가지지 않는, stateless 속성을 지니고 있기 때문입니다.
그렇기에 세션이 아닌 토큰을 기반으로 인증을 하는 OAuth가 API에서 자주 쓰이는 것입니다.
클라이언트가 API를 사용하기에 앞서서 인증 엔드포인트를(인증해달라는 요청을) 호출해서 자신을 입증을 하면 토큰을 얻습니다, 이 토큰을 모든 API 요청에 같이 첨부해서 보내는 것으로 API의 승인을 받을 수 있죠
OAuth의 인증 방식은 많으나 곧 설명할 Passport 패키지에서는 OAuth의 2가지 방식을 제공합니다
거기에 Passport 고유의 2가지를 더해 총 4가지의 방법이 있습니다.
즉 번호상 분리해 놓았지만 아래 방식은 다 Passport에서 지원하는 방식입니다.
1-1. 비밀번호 승인 방식(password grant)
가장 많이 쓰이는 인가 코드 승인보다는 덜 쓰이지만 훨씬 간단합니다.
클라이언트가 아이디와 패스워드를 API 서버에 보냄으로써 인증을 받으면 반환 값으로 API 토큰을 받습니다.
자체 애플리케이션에 사용하는 것이 좋습니다.
1-2. 인가 코드 승인 방식(authorization code grant)
가장 흔히 사용하는 OAuth 2.0의 방식으로 패스포트가 지원하는 방식 중 가장 복잡합니다.
사용자가 클라이언트 ID, 리다이렉트 URI, 응답 타입을 code를 지정하여 서버에 요청하면 클라이언트는 리다이렉트 URI로 이동합니다.
이동한 후 인증(로그인)을 거치고 나면 API 서버에서 저장한 리다이렉트 URI(클라이언트 서버)로 이동합니다
이걸 클라이언트 서버에서 라우팅 처리로 받습니다, 이때 오는 $request 값에 인가 코드 값이 있습니다.
받은 인가 코드 값과 client_id, client_secret, redirect_uri를 다시 서버 API 보냄으로써 토큰 값이 들어있는 response를 받을 수 있습니다.
2. 패스포트(passport)
OAuth 방식에 익숙하지 않은 사람들 위한 패키지.
OAuth 서버의 클라이언트와 상태를 관리하는 API까지 만들어줍니다, 또한 직접 프런트 엔드를 구성할 때 참고할 수 있는 vue 기반의 매니저 컴포넌트를 제공합니다. (약간 뜬금없네요), 패스포트는 고유의 2가지 인증 방식을 제공합니다.
2-1. 개인 접근 토근(personal access token)
쉽게 API를 테스팅하기 위한 토큰 방식으로 OAuth를 전혀 사용하지 않습니다.
코드에서 직접 사용자용 토큰을 만들 수 있습니다, 그렇기에 API에 사용하여 테스팅하기 적합합니다.
2-2. 동기화 토근(synchronizer token)
라라벨 애플리케이션에 로그인 한 사용자(이미 인증된)가 API에 접근할 때 사용합니다.
사용자에게 주는 모든 응답에 laravel_token이라는 쿠기가 추가되는데 이는 csrf 토큰 정보를 포함하는 JWT(json web token)입니다, 이 쿠키와 csrf 토큰으로 API에서 인증을 받습니다.
OAuth의 개념 : velog.io/@undefcat/OAuth-2.0-%EA%B0%84%EB%8B%A8%EC%A0%95%EB%A6%AC
OAuth의 방식 : cheese10yun.github.io/oauth2/
'PHP > Laravel' 카테고리의 다른 글
phpstorm + vagrant + xdebug 세팅 (0) | 2022.04.21 |
---|---|
[Laravel] 테스트 개념 및 실행 (0) | 2021.06.08 |
[Laravel] Laravel8에다가 React와 vue 올리기 (laravel/ui) (0) | 2021.04.05 |
[Laravel] 컴포넌트 총정리 (0) | 2021.04.03 |
[LifeCycle] 라라벨 Kernel, Service provider (0) | 2021.03.03 |