You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Spring은 보면, 요청이 들어왔을때, 그걸 DispatcherServlet에 전달하기 전에
filter라는것을 거치면서 들어온 요청의 헤더등을 검사하거나 값을 정제하는등의 일을 함.
그런 filter중에는 로그인과 관련있는 securityFilterChain(filter여러개)가 있음.
개발자는 이런 filter를 커스텀을 할 수 있는데, SecurityConfig에서 위 filter를 커스텀하고있음.
거기서 보면, oauth2login을 사용하겠다고 써있구, 만약 로그인에 성공해서 회원정보가 들어왔을경우(userInfoEndpoint)
해당 회원정보를 가지고 특정한 서비스 작업을 하도록 Service 클래스에게 회원정보를 넘김(userService())
그래서 .userService()안에다가 oAuthUserService를 적어놓음!
oAuthUserService는 interface여서 loaduser라는 함수를 오버라이드해와야함
해당 함수는 받은 회원정보를 받아서 처리하구, spring security쪽으로 oauth2user를 돌려주는데
사실 oauth2user를 리턴해주면 그걸로 뭘하는지는 잘 모르겠음^^,,
일단 회원정보 정제해서 1)세션에 넣고 2)db에 넣는 부분이다!!!
받은 json을 OAuthAttributesDTO로 넘겨서 깔끔하게 값을 정제하는거임
DTO은 별게 아니고, 그냥 받은 data를 그대로 넘기면 너무 복잡하니까 원하는 값만 쏙쏙 뽑아서 dto속 변수에 넣어서 사용하는거임
data를 주고받을때 쓰는 예쁜 포장상자같은 느낌
OAuthAttributesDTO ofKakao 함수를 보면, 쟤를 받아서 builder를 통해서 본인(OAuthAttributesDTO)를 만들어줌
builder는 별게아니구 걍 생성자 편하게 만들라고 있는 lombok 어노테이션임
kakao_account 부분 파싱하고, 거기서 또 get("email") 파싱해서 dto에 넣어주고,
profile 부분 파싱해서 get("nickname"), get("profile_img_url") 파싱해서 dto에 넣어줌
그리고 json 맨위에 있는 id가 카카오계정별 고유 아이디라 우리서비스 회원가입했는지 보기위해서 사용하고 싶어서 또 파싱해서 넣어줌
다 넣었으면, 이거를 build해서 리턴함. dto 생성자로 생성해서 넘겨줬다는거임
5. 회원정보를 정제한 oauthAttributes로 service가 하는일은?
고러면 OAuth2UserService에서 dto를 받아서,
dto.getKakaoId()를 통해 db에서 같은애 있는지 찾아서 보고 없으면 회원가입 시키기 - saveOrUpdate
1번을 하면 Member를 가져올 수 있는데, 걔를 통해서 SessionUserDTO를 또 만들어줌.
참고로 SessionUserDTO는 member를 받으면, member.getMemberId(), member.getAuthority()해서 본인한테 넣어주는 dto임.
어쨌든 그렇게 만들어서 해당 SessionUserDTO를 세션에 넣어줌!(httpSession.setAttribute)
이렇게 하면 세션유지까지 로그인과정이 끝나게 되고,
나중에 현재 로그인한 유저정보 갖고오고싶으면 httpSession.getAttribute([key값]) 적어주면 아까 넣은 SessionUserDTO가 반환됨
그러면 거기서 깔쌈하게 dto.getMemberId()해보면 id가져올수있는거임!
이러한 일련의 과정을 거치게됨...
그냥 builder는 객체 만들때 넣을 값이 좀 많고 헷갈리면 편하게 생성자 만들라고 있는거!
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
<로그인 전체 흐름>
1. Filter가 뭘까?
Spring은 보면, 요청이 들어왔을때, 그걸 DispatcherServlet에 전달하기 전에
filter라는것을 거치면서 들어온 요청의 헤더등을 검사하거나 값을 정제하는등의 일을 함.
그런 filter중에는 로그인과 관련있는 securityFilterChain(filter여러개)가 있음.
개발자는 이런 filter를 커스텀을 할 수 있는데, SecurityConfig에서 위 filter를 커스텀하고있음.
거기서 보면, oauth2login을 사용하겠다고 써있구, 만약 로그인에 성공해서 회원정보가 들어왔을경우(userInfoEndpoint)
해당 회원정보를 가지고 특정한 서비스 작업을 하도록 Service 클래스에게 회원정보를 넘김(userService())
그래서 .userService()안에다가 oAuthUserService를 적어놓음!
한마디로 요 filter덕분에 로그인 요청을 보내고, 로그인을 완료해서 회원정보가 들어오면
oAuthUserService로 넘어감.
2. oAuthUserService란?
oAuthUserService는 interface여서 loaduser라는 함수를 오버라이드해와야함
해당 함수는 받은 회원정보를 받아서 처리하구, spring security쪽으로 oauth2user를 돌려주는데
사실 oauth2user를 리턴해주면 그걸로 뭘하는지는 잘 모르겠음^^,,
일단 회원정보 정제해서 1)세션에 넣고 2)db에 넣는 부분이다!!!
여튼, loaduser(userRequest)해서 oauth2user를 가져오고,
oauth2user.getAttributes()하면 회원정보 json이 받아와짐.
3. oAuthAttributesDTO를 service가 사용하는 이유
받은 json을 OAuthAttributesDTO로 넘겨서 깔끔하게 값을 정제하는거임
DTO은 별게 아니고, 그냥 받은 data를 그대로 넘기면 너무 복잡하니까 원하는 값만 쏙쏙 뽑아서 dto속 변수에 넣어서 사용하는거임
data를 주고받을때 쓰는 예쁜 포장상자같은 느낌
살짝 셀털이지만, json이 어떻게 생겼는지 보여주면
{
"id": 숫자10자리,
"connected_at": "2022-06-24T06:49:55Z",
"properties": {
"nickname": "김시연",
"profile_image": "http://k.kakaocdn.net/~~/img_640x640.jpg",
"thumbnail_image": "http://k.kakaocdn.net/~~/img_110x110.jpg"
},
"kakao_account": {
"profile_nickname_needs_agreement": false,
"profile_image_needs_agreement": false,
"profile": {
"nickname": "김시연",
"thumbnail_image_url": "http://k.kakaocdn.net/~~/img_110x110.jpg",
"profile_image_url": "http://k.kakaocdn.net/~~/img_640x640.jpg",
"is_default_image": true
},
"has_email": true,
"email_needs_agreement": false,
"is_email_valid": true,
"is_email_verified": true,
"email": "~~"
}
}
4. oAuthAttributesDTO가 회원정보를 어떻게 정제하는가?
OAuthAttributesDTO ofKakao 함수를 보면, 쟤를 받아서 builder를 통해서 본인(OAuthAttributesDTO)를 만들어줌
builder는 별게아니구 걍 생성자 편하게 만들라고 있는 lombok 어노테이션임
다 넣었으면, 이거를 build해서 리턴함. dto 생성자로 생성해서 넘겨줬다는거임
5. 회원정보를 정제한 oauthAttributes로 service가 하는일은?
고러면 OAuth2UserService에서 dto를 받아서,
참고로 SessionUserDTO는 member를 받으면, member.getMemberId(), member.getAuthority()해서 본인한테 넣어주는 dto임.
어쨌든 그렇게 만들어서 해당 SessionUserDTO를 세션에 넣어줌!(httpSession.setAttribute)
이렇게 하면 세션유지까지 로그인과정이 끝나게 되고,
나중에 현재 로그인한 유저정보 갖고오고싶으면 httpSession.getAttribute([key값]) 적어주면 아까 넣은 SessionUserDTO가 반환됨
그러면 거기서 깔쌈하게 dto.getMemberId()해보면 id가져올수있는거임!
이러한 일련의 과정을 거치게됨...
그냥 builder는 객체 만들때 넣을 값이 좀 많고 헷갈리면 편하게 생성자 만들라고 있는거!
Beta Was this translation helpful? Give feedback.
All reactions