문제상황
•
42 측의 휴학 유저(AGU) 추가 와 Cabi 내에서 수요지식회 업데이트 가 진행되면서 기존 인증, 인가 방식에 대해 부족함을 느끼게 되었다.
•
휴학 유저는 42 oauth 로그인 불가능 → cabi 서비스를 이용할 수 없음
사물함 반납을 못하게되니 채널에 대리반납을 요청하거나 문의를 넣는 유저들이 꽤 발생했다.
42 oauth 서버 다운 시 대체 로그인 방식을 도입할 겸, 소셜 로그인 연동기능을 추가해 휴학 유저도 서비스 이용 가능케하자.
•
수요 지식회가 리뉴얼되며 발표에 대한 사진 및 영상을 발표자가 포트폴리오로 활용할 수 있도록 기록하는 것이 큰 목표가 되었고, 이로 인해 외부 이용자도 자유롭게 발표 내용 및 일정을 볼 수 있어야한다.
기존 서비스에서는 accessToken이 없으면 무조건 서비스 이용이 불가능했으니, 인가 방식을 변경해보자
기존 방식
•
OAuth2 로그인
ScribeJava 라이브러리를 사용, yml 파일을 주입받은 url 관련 Property 객체 생성, 지정된 url로 요청을 보내 정보를 내려받음
◦
새로운 소셜 로그인을 추가할 때마다 객체를 새로 만들고, 컨트롤러도 새로 만들어야해서 내가 언해피함
•
모든 요청에 대한 Interceptor + 커스텀 어노테이션 AuthGuard, AOP 방식
요청 시 access_token 검증, 토큰 파싱 후 내부의 email을 쿼리로 돌아 실제 유저인지 검증 및 인가
◦
public한 페이지에 대해서는 어떻게..? 모든 요청에 대해서 불필요하더라도 유저인지 검증하기 위해 쿼리가 1회씩 꼭 돌아서 인증 / 인가의 경계가 모호함
목표
1.
ServletFilter에서 url별 인가 검증하기
2.
여러 개의 소셜 로그인 연동 추가 방식 간소화하기
3.
access, refresh token 도입하기 및 정보 덜어내기
쉽게, SNS로그인 + JWT 인가 구현할건데, 이걸 Spring Security와 함께할겁니다 ㄱㄱ!!
Spring Security?
•
인증(Authentication, 로그인), 인가(Authorization, 권한 부여)와 관련해 편리한 기능들을 제공해주는 라이브러리이다.
이 글을 읽는 Security에 대해 궁금한 누군가도 함께 어떻게 구현했는지 구경하며 Security를 느껴보자.
Q. 그럼 Security를 이해하기 위해서는 뭐부터 알아야해요?
A.
도망가지 말아다오.. 생긴거만 험악하지 읽어보면 다들 따스한 필터들이다..
하지만 아~ 대충 rgrg, 일단 박죠? 했을 경우 남는건 수많은 Servlet 및 FilterChain Exception 관련 로그와 어디에서 발생한지도 모른 채 돌아온 401, 403 에러들 뿐ㅠㅠ
저런 수많은 필터를 쓰는 근본적인 이유는 아래의 두 개념을 세분화하여 관리하기 위함이다!
인증(Authentication)
인증은 쉽게 말하면 로그인 이라고 생각하면 된다.
웹앱이 너 누구야? 했을 때 아이디 비밀번호를 입력 → 자격 증명 → 저 유저 맞는데요
로그인 실패 시 security는 AuthenticationException을 반환하고, Unauthorized 401으로 처리된다
•
에러 이름은 authorized(인가)인데 왜 authentication(인증)이랑 관련?
◦
저도 궁금했는데요.. Unauthorized 용어 자체가 사용자가 인증되지 않았거나, 인증 정보가 유효하지 않다는 뜻까지 확장됐기 때문이라고합니다. 오래된 애라 그렇다함..
인가(Authorization)
권한, 즉 어디까지 접근 가능하세요?를 물어본다.
서버의 cabinet 관련 리소스는 ‘USER’ 롤 이상부터 접근 가능하다고 판별을 한다던지 머..
security에서는 AccessDeniedException을 반환하고, 403 Forbidden으로 처리된다.
캬~ 인증 인가에 대해 깨달았다? 일단 나보다 Security 잘한다고 자부한다.
이제 코드와 함께 필터가 어떻게 작동하는지 알아보자!