목록혼자하기 (21)
오래 못 할 짓 하지 않기

DB에 회원이 로그인한 정보를 담아야 하기 때문에 이렇게 로그인할 때 넘어오는 정보에서 어떤 걸 DB에 저장할지 모아둔다. 그리고 로그인할 때 들어오는 정보들에 대해서 처음 들어오는 정보인지 그렇지 않은지를 판단하여 i) 처음 들어오는 정보 → 응답받은 내용을 기반으로 UserEntity를 만든다. ii) 이미 있는 정보 → 변한 내용이 있을 수도 있으니 바뀔 수 있는 것들을 업데이트 해준다. 하지만 고려할 점이 있다. 어떤 걸로 이 사람이 이미 있는지 아닌지 판단해야한다. → 그러기 위해서 정보를 고유한 값으로 만들 수 있도록 만든 것이 username 이다. provider와 providerId를 조합하여 하나의 String으로 만들어서 이 또한 같이 넣어준다. 이는 같은 유저마다 같은 값이 나오지 ..

Service 단에 가장 아래 Return 부분에 다음과 같이 추가한다. 그 다음 CustomOauth2User 클래스를 추가한다. 이렇게 추가한 다음 실행시켜 보자 my페이지로 가기 위해서는 authenticated 되어있어야 한다. 이유▼ 저기에 되어있는 페이지 말고는 다 로그인 되어야 함. 로그인 창이 뜨고 이에 맞게 로그인하면? 성공 콘솔에도 성공적으로 뜬다

저번 시간에 구글 로그인까지는 됐다. 근데 로그인 됐는데 그 정보는 들어온 순간 휘발되어 날라감. 그걸 처리하는 service단이 필요하다. 로그인한 유저가 들어와서 Provider가 naver인지 google인지 구분하여 그에 맞게 처리를 한다. 구분해야 하는 이유는?? ▶ 구글과 네이버에서 주는 데이터 형식이 다르기 때문에 코드▼ 더보기 package com.example.oauthnojwt.service; import com.example.oauthnojwt.dto.GoogleResponse; import com.example.oauthnojwt.dto.NaverResponse; import com.example.oauthnojwt.dto.OAuth2Response; import org.spring..
https://min-h-study-review.tistory.com/274 https://min-h-study-review.tistory.com/275 이거 두 개 보면 뚝딱임

이번에는 페이지가 제대로 넘어가는 것도 확인할거기 때문에 아래 mustache 파일로 넘어갈 수 있도록 그에 관련된 Controller를 만들어준다. 그 다음 config 패키지에 SecurityConfig를 만들어 아래와 같이 만들어준다. 코드 ▼ 더보기 package com.example.oauthnojwt.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.anno..

JWTFilter를 만든다. 그 클래스는 OncePerRequestFilter를 상속받는다. 로직은 간단하다. 1. Authorization라는 이름의 쿠키에 담겨있는 값을 가져온다. 2. 그 값이 null이면 다음 필터로 넘기고 종료, 아니면 그 뒤 인증 단계를 거친다. 3. 그 토큰이 소멸되었는지 판단하고 그렇지 소멸되었다면 다음 필터로 넘기고 종료, 아니면 그 뒤 인증 단계를 거친다. 결과적으로 Null이 아니고 만료되지 않은 토큰만 필터를 통과한다. 코드▼ 더보기 package com.example.oauthtest.jwt; import com.example.oauthtest.dto.CustomOAuth2User; import com.example.oauthtest.dto.UserDTO; impo..

로그인에 성공했을 때, 실행되어야 하는 핸들러를 만들어서 내부에 JWT 발급을 구현한다. Handler 내부 구현은 다음과 같다. 최종적으로 토큰을 발급할거니까 JWTUtil을 주입받아야하고 성공했다는 SimpleUrlAuthenticationSuccessHandler 를 상속받는다. 29번째 줄 : 로그인에 성공했다면 유저의 로그인 정보를 가져온다. 34,40번째 줄 : 로그인한 유저 정보에서 username, role을 가져온다. 43 번째 줄 : 그걸 기반으로 토큰을 만든다. 이걸 쿠키 형식으로 보내준다. 코드▼ 더보기 package com.example.oauthtest.oauth; import com.example.oauthtest.dto.CustomOAuth2User; import com.ex..

토큰을 이렇게 생성한다. 받는 정보들 + 발급 날짜 + 만료 날짜 + secretKey로 만들고 그 정보들을 뒤죽박죽해서 토큰 하나를 만든다. 받는 정보들은 페이로드에 다 담기게 된다. 그럼 토큰을 통해 Username,Role,Expired 여부를 어떻게 알 수 있을까? 결과적으로 복잡하긴한데 return 구조를 뜯어보면 1) Secret Key를 이용하여 토큰을 parsing하고 2) 그렇게 parsing한 내용에서 Payload에 있는 { 내가 찾으려고 하는 정보 } 를 얻는다.

우리는 들어오는 정보를 받아서 그 안에 담겨있는 유저를 String username = oAuth2Response.getProvider()+" "+oAuth2Response.getProviderId(); 이런 형태로 받는다. 따라서 받을 때 저 username으로 저장되며, 그 username이 DB에 존재하는지 여부에 따라서 새로 들어오는 사람인지, 원래 있던 사람인지 판단한다. 그러기 위해서는 DB에 들어갈 유저 Entity와 Service단과 DB를 이어줄 UserRepository가 필요하다 이후 Service 단에서 해줄 것은 하나다. DB에서 String username = oAuth2Response.getProvider()+" "+oAuth2Response.getProviderId(); 이 ..

리소스 서버에서 OAuthService로 데이터를 주면 그 데이터를 OAuth관련 DTO에 담아서 Provider 단에서 검사하게 하여 로그인 하려고 한다. 33번째 줄부터 추가한다. Auth Response의 provider 에 Provider ID를 덧붙인 형태로 userName을 구성한다. DTO에서는 1. 이 userName을 유저 이름으로 유저 명으로 (식별 ID라고 생각하면 된다) 2. oAuth2Response에서 날아온 Name (프로필에 있는 이름) 을 Name으로 3. Role은 직접 넣어준다. 이렇게 DTO를 구성하여 CustomOauth2User에 넘겨준다. CustomOauth2User는 이렇게 생겼다. getAuthorities는 어떻게 된지 모르겠다. 그냥 역할을 받아오는 역할..