[Spring] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스5

김나윤·2024년 10월 13일
0

Spring

목록 보기
7/9

5. 스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현하기

OAuth는 처음 사용해보는 것이기도 하고 그 원리가 무엇인지 알지 못 해서 관련 글을 여러 개 찾아보았다.

1) 스프링 시큐리티와 스프링 시큐리티 Oauth2 클라이언트


2) 구글 서비스 등록

구글 서비스 등록 부분이 교재와 달라진 부분이 많아 검색하다, 잘 정리된 블로그가 있어 해당 글을 참고하여 실습해보았다.

https://velog.io/@chrkb1569/OAuth-2.0%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84#%EA%B5%AC%EA%B8%80-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%A4%EC%A0%95

테스트 사용자는 따로 설정하지 않고 바로 다음 단계로 넘어갔다.

모든 단계를 완료하면 내가 지정한 설정에 대한 요약 화면이 나타난다.

그렇다면 다시 사용자 인증 정보 > +사용자 인증 정보 만들기 > OAuth 클라이언트 ID 를 선택한다.

최종적으로 리디렉션 URI까지 입력하고 만들기 버튼을 누르면 클라이언트 ID클라이언트 보안 비밀번호를 얻을 수 있다.


다음 단계로는 코드를 작성하여 Oauth 관련 설정을 해준다.

먼저, application-oauth를 등록해야 하는데, application.properties가 있는 디렉토리에 application-oauth.properties 파일을 생성한다.

그리고 해당 파일에 클라이언트 ID와 클라이언트 보안 비밀코드를 각각 등록한다.

spring.security.oauth2.client.registration.google.client-id=클라이언트 ID
spring.security.oauth2.client.registration.google.client-secret=클라이언트 보아나 비밀번호
spring.security.oauth2.client.registration.google.scope=profile,email

다음으로, application.properties 파일에는 spring.profiles.inclue=oauth 코드를 추가한다.

마지막으로, .gitignore 등록을 한다.
구글 로그인을 위한 클라이언트 ID와 클라이언트 보안 비밀번호는 다른 사람이 알면 안 되는 정보이다. 이것들이 외부에 노출되면 언제든 개인정보가 탈취될 수 있으니 보안을 위해 application-oauth.properties 파일이 깃허브에 올라가는 것을 방지해야 한다.
이를 위해 .gitignore 파일을 열어

application-oauth.properties

코드를 추가한다.
추가한 뒤 커밋했을 때 커밋 파일 목록에 application-oauth.properties가 나오지 않으면 성공이다.

깃허브 레파지토리를 만들 때 main과 master 두 브랜치가 만들어져 master 브랜치를 없애고 main에 push 하려고 했지만 잘 되지 않아 새로 레파지토리를 만들게 되었다.
그러면서 커밋 목록을 확인해보았더니 application-oauth.poperties 파일은 커밋 목록에서 제외되었음을 알 수 있었다.


3) 구글 로그인 연동하기

구글 로그인 인증정보를 발급 받았으니 프로젝트 구현 단계만 남았다.
먼저 사용자 정보를 담당할 도메인인 User 클래스를 생성한다.

domain패키지 아래에 user패키지를 생성하고 User 클래스를 생성해 코드를 입력한다.

그리고 각 사용자의 권한을 관리할 Enum 클래스 Role을 생성한다.

여기서 문법적인 문제가 없는 것 같은데 계속해서 USER("ROLE_USER", "일반 사용자"); 에 빨간 밑줄이 사라지지 않는 것이었다.
이것저것 검색해보기도 하고 코드 뒷부분을 마저 입력하면 해결될까 싶어 다음 단계 먼저 진행해보았지만 여전히 남아있었다.
그러다 SecurityConfig.java 파일의 deprecated 된 부분을 해결하던 중, USER가 아예 먹지 않았다는 것을 알게 되었고 그 이유가 Enum constant가 아예 만들어지지 않았기 때문이라는 것을 발견했다.
아니 분명 나 만들었는데..?

....GUEST()와 USER() 사이를 콤마로 구분해주지 않았던 것.....

..ㅠ바보

마지막으로 User의 CRUD를 책임질 UserRepository도 생성한다.

이렇게까지 하면 User 엔티티 관련 코드는 모두 작성되었고 본격적으로 시큐리티 설정에 들어간다.

스프링 시큐리티 설정

먼저 build.gradle에 스프링 시큐리티 관련 의존성 하나를 추가한다.

build.bradle 설정이 끝났으면 OAuth 라이브러리를 이용한 소셜 로그인 설정 코드를 작성한다.

config.auth 패키지를 생성해, 앞으로 시큐리티 관련 클래스는 모두 이곳에 담아주도록 했다.

먼저 config.auth 폴더에 SecurityConfig 클래스를 생성한다.
원래 교재에 나온 코드는 현재 버전과 맞지 않는 부분이 많아 일단 주석처리해주었다.

<이 부분 코드 수정한 내용 적어주기>

설정 코드 작성이 끝났으면 CustomOAuth2UserService 클래스를 생성한다.
이 클래스에서는 구글 로그인 이후 가져온 사용자의 정보(email, name, picture 등)들을 기반으로 가입 및 정보수정, 세션 저장 등의 기능을 지원한다.

CustomOAuth2UserService 클래스까지 생성한 후, OAuthAttributes 클래스를 생성한다. 교재의 필자는 OAuthAttributes를 Dto로 취급하기 때문에 나도 config.auth.dto 패키지를 따로 만들어 클래스를 생성해주었다.

이후, 인증된 사용자 정보를 담기 위해 config.auth.dto 패키지에 SessionUser 클래스를 추가한다.

여기까지 코드를 제대로 다 입력했는데도 import 하라는 메시지도 안 뜨고 계속 빨간 글자만 가득하길래 음..뭐지..? 싶었는데,
생각해보니 gradle에 의존성 추가하고 reload를 안 했던 것!
reload하고 해당 코드로 다시 넘어가보니 import가 제대로 떴다.
Gradle 수정했으면 바로 reload 하는 것 잊지 말자!

로그인 테스트

이렇게까지 코드를 완성하고 드디어 제대로 로그인이 되는지 확인해보려고 run해보았는데..

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "drop table if exists [*]user"; expected "identifier"; SQL statement:

이건 뭐야.. 못 보던 오륜데..
H2 사용하는 과정에서 무슨 오류가 생긴 것 같은데 대충 읽어보니 user라는 식별자를 찾지 못해 생긴 오류 같았다.
구글링 해보니 H2 DB에서는 user가 예약어라 사용을 못 한다는 것을 알게 되었다.
이를 해결하기 위해서는 User 클래스에 @Table(name="UERS")를 추가해주고 다시 run하면 해결된다고 한다.

정상 작동!
Google Login 버튼을 눌러보면

흔히 보던 구글 로그인 페이지로 잘 넘어가는 것을 확인할 수 있다.

계속~

?된 거겠지

http"//localhost:8080/h2-console 에 접속해 회원가입이 잘 되었는지 확인해보도록 한다.

정상적으로 데이터베이스에 회원정보가 들어간 것까지 확인!


4) 어노테이션 기반으로 개선하기


5) 세션 저장소로 데이터베이스 사용하기


6) 네이버 로그인


7) 기존 테스트에 시큐리티 적용하기

profile
Hello, world!

0개의 댓글