500에러 문법오류

thymeleaf 에 sec: 속성을 적용하면 타임리프 표준문법이 아니라 ide에서 에러를 보여주지만 실행은 정상동작한다. 하므로 오류가 났다면 다른곳에서 찾아볼것
500에러가 발생했는데 알고보니 ArticleRequest에 몇 필드를 잘못 작성해서 컨트롤러에서 파라미터를 받아오지 못해 문법오류라고 인식했다.

오류 발생했을때 처음부분말고 길게 로그 나오다가 causeBy라고 나온 에러 부분을 확인해야 한다는 것을 알았으면 더 빨리 수정할 수 있었을듯

프론트랑 나누어서 작업했다면 hmtl파일이 아닌 다른 곳에서 더 확인해보려고 했을텐데 500에러 원인이 서버언어의 구문 에러(스크립트 문법 오류)가 원인이라고 했는데 왜 프론트에서 에러를 찾으려고 했는지...
sec:을 IDE에서 에러 표시를 해서 그것이 원인이라고 생각했던 것 같다..
서버언어 구문 에러라는 것이 컨트롤러나 도메인Dto 등등 을 봐보면 될 것같다..

oauth config

redirect uri 로 code받고
코드로 토큰받고 사용자정보 요청한다음에 다시
인증서버로 응답을 보내는데 뭘보내?
토큰을 저장해놔야하나? 아닐텐데

redirect-uri

스프링부트를 실행할때 가지고있는 도메인 정보로 치환해줌
{baseurl} {}같은 값이 들어가면 yaml파일에서
string으로 인식하지 못하므로 ""표시를 해줘야함
인증서버에 요청할때 사용할 HTTP method를 지정

client-authentication-method

인증받을때 사용하는 메서드는 post

user-name-attribute

id는 인증정보를 불러오면 rest api를 불러서
인증정보를 데이터로 바디로 불러온다
@@@ property 가 들어있따
프로퍼티중에 username을 확인하기 위해
필요한 식별자 정보를 알려줘야함
스프링부트 프로젝트는 모른다 .

권한 uri 에서 정보를 받았을떄 다음과 같이 데이터를
id:1, nickname:uno, password:asdfasdf 받았을떄
고유 유저라는 것을 확인하기 위한 정보가 무엇인지
스프링부트에게 알려줘야함
카카오에서는 id

oauth 인증정보(사용자 정보) 얻는 법

인증부분을 카카오에게 위임한다.
인증은 받았는데 정보는 우리 디비에 없음
글을쓰거나 댓글쓰거나 수정하거나 지우거난 기능쓸때
스프링은 디비 정보를 참조하려고 한다.

인증정보 얻는 법 2가지

인증정보는 카카오서버로부터왔음 디비에는 없음 따라서 에러 발생
크게 두개 방법이 있다.
1 인증정보를 우리 디비에 저장하고 반복적인 니즈있을떄 디비정보 사용
2 인증한뒤에도 매번 인증서버에 인증정보를 요청함

1방식을 사용해 구현

인증정보를 DB에 저장

유저어카운트 리포지토리에 CRUD를 한다.
제피에 리포지토리에서 인스턵스 저장하느 방법은
세이브 메서드 호출한다.
담는 정보는 처음했떤 설계를 따른다
없는 것이 있따. 오디팅 필드 값에 시간은 들어가지만
유저에 대한 것은 인증정보르 부터 값을 넣는다 .

로그인한 상태 아닐때 카카오 인증서버로 로그인해도
인증정보가 디비에 없으니
오디팅에 수정자는 알아낼수없음

오디팅 필드를 프로텍티드로 해서
유저어카운트 생성자에 수정자 생성자 를 넣는다 .
생성한 사람의 아이딩르 받을수있다.
수정자는 생성자와 같은사람 - 처음생성했을떄

생성자가 변경돼도 팩토리 메서드를 사용
했기떄문에 서비스에 영향 x
영향받는곳은 팩터리 메서드뿐이다.

팩터리메서드는 크리바이를 안받는다 .
인증이미 받고있는 상태일때 크리바이에 널을 넣어준다?

회원가입을 최초로 하는 시나리오
인증정보가 없을떄 크리바이 값을 넣어줘야함
인자로 크리바이를 받아서

ctrl + B 로 어느곳에서 이 메서드가 참조되고있는지 확인가능

OAuth2User

유저디테일즈를 구현시켜서 보드프린시플이
단순 클래스가아닌
스프링 시큐리티가 인식할수있는 인증정보임을 나타냄
보드프린시플이
기본 스프링시큐리티 인증기술만이 아닌
오옷2 인증기술도 사용할수있도록 오옷2유저를 구현한다.

커맨드 엔 -> 임플리멘트

어트리뷰트는 오옷2 인증서비스마다
인증결과로 내려주는 회원정보나 정보
를 맵(스트링 옵젝) 레스트풀하게 만들어져
제슨 형식으로 리스폰스 받더라도 구조가 다르므로
키밸유로 내려주기만하면 받을수있도록
애트리뷰트를 만듬

인증정보 전체내용이 어트리뷰트에 담긴다.
어트리뷰트 제대로받아야 시큐리티 제대로 동작
옵젝으로 받는것은 어떤 데이터타입이든
들어올 수 있지만 매번 캐스팅을 해줘야함
타입 세이프티를 활용할수없는 단점이있지만
어떤 서비스 프로바이더가 제공하는 것이더라도
오옷기술을 사용할수있도록 함

사용자가 알고 넣지 않아도 되도록

보드프린시플 생성자 바뀌니 영향받을것

오옷2 인증기술을 사용할수있도록 인증정보 구현
회원 도메인이 인증 없는 상태에서 회원 정보를 저장할 수 있게 수정하기

카카오 인증 응답 정보(사용자 정보) 확인 정의 하기

KakaoOAuth2Response, KakaoAccount, Profile

3 카카오 인증서버 레스트 에피아 호출했을떄 받는
인증 데이터 ( 사용자 정보 불러오기 할떄 받는 정보는)

응답을 보면 카카오 어카운트
아이디 프로퍼티 등을 받는다
카카오 어카운트는 프로필정보 계정이름등을 받는다

상요자정보 불러오기 할떄 받을때 쓸
오옷2 리스폰스를 생서한다 .

OAUTH2UserService

UserAccountService

saveUser()구현
UserAccount 생성할때 createdBy는 username을 넣어줘서
로그인한 사람이 생성한 것으로 저장한다.
Dto로 변환하여 저장한 UserAccount 를 반환한다.

OAuth 인증 처리 구현체 사용

카카오 인증정보를 회원으로 등록

UserDetailService?

username을 받아서 BoardPrinciple 을 반환한다. 저장하는건가 ?

SecurityFilterChain 람다

메서드 체이닝으로 SecurityFilterChain을 구현할때
메서드의 인자로 람다식을 사용하면 다음 메서드를 설정하는 것으로 넘어갈때
.and()를 붙이지 않아도 된다.

    @Bean
    public SecurityFilterChain securityFilterChain(
            HttpSecurity http,
            OAuth2UserService<OAuth2UserRequest, OAuth2User> oAuth2UserService
    ) throws Exception {
        return http
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
                        .mvcMatchers(
                                HttpMethod.GET,
                                "/",
                                "/articles",
                                "/articles/search-hashtag"
                        ).permitAll()
                        .anyRequest().authenticated()
                )
                .formLogin(withDefaults())
                .logout(logout -> logout.logoutSuccessUrl("/"))
                .oauth2Login(oAuth -> oAuth
                        .userInfoEndpoint(userInfo -> userInfo
                                .userService(oAuth2UserService)
                        )
                )
                .build();
    }

.authorizeHttpRequests() 에 람다식을 인자로 지정하여서
.formlogin(withDefaults()) 메서드 설정으로 넘어갈떄 .and()를 사용하지 않아도 된다.
withDefaults()는 아무 일도 안 한다. 람다식 사용을 위해 사용
.logout(), .oauth2Login()으로 넘어갈때도 사용하지 않았다.
더 짧게 표현이 가능하다.

profile
https://github.com/jyzayu

0개의 댓글

Powered by GraphCDN, the GraphQL CDN