스프링 시큐리티
- 인증, 인가를 기반으로 한 스프링 하위 프레임워크
- 인증(Authentication) 은 간단히 말하면 로그인
- 인가(Authorization) 는 간단히 말하면 내가 유저인데 어드민 권한으로 다른 사람의 계정 정보를 보거나 유저를 삭제할 수 없듯, 권한을 의미한다.
OAuth
- Open Authorization
- 인증 처리를 대신 해준다.
- 스프링 공식 OAuth 주체
- Facebook
- Google
- OAuth2 Client 라이브러리
OAuth가 나오게 된 배경
- third party application 에게 사용자의 비밀번호를 노출하지 않으면서, 어떻게 로그인(인증)과 권한(인가)를 부여할지에 대한 니즈에서 나오게 된 프로토콜
소셜 로그인 구현
- 각각 사이트의 개발자버전 사이트에서 client-id 와 client-secret 키를 받아야 한다.
- 추가로 scope, redirectUri, userNameAttributeName, attributes 라는 개념이 있다.
scope
- 동의를 체크해서 데이터를 얻어오는 범위
- name, nickname, email... etc
- 스코프를 명시하지 않으면 google, facebook 은 OAuth2가 아닌 OpenId 방식으로 처리한다.
- OidcService(OpenId Connect Service) 에서 처리한다.
- OAuth는 권한 부여를 위한 것이다.
- 인증을 마치고 어떤 요청에 권한이 있는지 체크
- OpenId Connect 는 인증을 위한 것이다.
- 그렇기 떄문에 OpenId 방식을 선택하면 인증을 위한 JWT(Json Web Token)을 직접적으로 만들어준다.
redirectUri
- 기본적으로 소셜로그인 처리는 정해진 링크로 301 302(차이는 영구이동, SEO, Page Rank) 를 하고 성공이나 실패를 판단 후에 보내질 리다이렉트 경로가 있어야 한다.
- 성공/실패 핸들러에서 직접적인 Uri로 보내줄수도 있지만, Handler가 없다면 디폴트 리다이렉트로 간다.
- 추가로 리다이렉트 uri까지 맞아야 동작하는 소셜도 있기 때문에 개발자 사이트에 명시해줄때 알맞게 입력해야 한다.
attributes
- 클래스의 객체로 보면
Map<String, Object> attributes
이다.
- 각각 다른 인증마다 전달해주는 데이터들이 다르기 때문에 Map에서 값을 유동적으로 채운다.
- 비슷하게 HttpMethod 통신도 Map으로 값을 받아올 수 있다. 대신 값이 명확하지 않고 너무 확장성 있는 코드와 API 명세에 어려움이 있기 때문에 명확하게 Request, Response DTO class로 쓸 뿐이다.
provider
oauthId
보통 provider, oauthId 2개를 이용해서 DB에 저장하고 토큰을 만들게 된다.
참고