본문 바로가기
오류를 개발새발

Header 에 Authorization 이 안 뜨는 현상...인데...하....

by 휴일이 2023. 1. 11.

jwt 토큰 개발 중,

나는 정상적으로 로그인을 했으나

헤더에 Authorization 이 뜨지 않는 현상이 발생했다

 

 

 

 

 

 

그리고 권한이 url로 가면

403 에러(권한 없음)가 뜬다....

 

 

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
        System.out.println("successfulAuthentication 실행 됐으니 로그인 인증이 완료됐네요");
        // authResult 객체로 jwt 토큰을 만들자 !
        PrincipalDetails principalDetails = (PrincipalDetails) authResult.getPrincipal();

        // java-jwt 라이브러리로 만들어 보자 !
        // RSA 방식 X
        // Hash 암호 방식
        String jwtToken = JWT.create()
                // 토큰이름?
                .withSubject("cos")
                // 토큰 만료 시간 10분
                .withExpiresAt(new Date(System.currentTimeMillis() + (60000 * 10)))
                //비공개 클레임 넣고싶은 키 밸류값 넣을 수 있음
                .withClaim("id", principalDetails.getUser().getId())
//                .withClaim("username", principalDetails.getUser().getUsername()) //굳이?
                .sign(Algorithm.HMAC512("cos(sign)"));
        response.addHeader("Authorization", "Bearer"+jwtToken);
//        response.addHeader("\"Access-Control-Expose-Headers\"", "Authorization");
        System.out.println("헤더에 추가 완료");
        System.out.println("Bearer"+jwtToken);
        super.successfulAuthentication(request, response, chain, authResult);
    }

 

분명히 토큰을 만들어서 response 헤더에 넣었는데도 안 뜸...

그래서 jwt 토큰 생성 후 동작하는 필터에서 헤더를 꺼내보니

 

 

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("필터1");
        HttpServletResponse response1 = (HttpServletResponse) response;
        String header = response1.getHeader("Authorization");
        System.out.println("header = " + header);
        filterChain.doFilter(request, response);
    }

 

 

null 값이 뜬다....ㅡ.ㅡ

 

 

디버깅해보니

 

response 에는 헤더 값이 들어가있는 거 같담..

addHeader () 이후 저 값이 추가됨

 

 

계속 coyoteresponse 보면서

authorization 있는지 확인했는데

이상하게 필터1만 가면 헤더가 사라져있음...ㅎㅎ

 

 

아...return null....

 

 

일단 이걸 찾았음...

UserDetails 구현 클래스에서

authrities 만들어놓고

null 값 리턴하게 해놨더라....^^

일단 이걸 authrities를 리턴하게 수정했다

 

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        user.getRoleList().forEach(r -> {
            authorities.add(() -> r);
        });
        return authorities;
    }

 

 

하지만 여전히 헤더에는 토큰 값이 들어오지 않았다....

 

 

디버깅을해도..

문제가 없어보였다....

그런데...

 

 

띠용

 

jwt 토큰을 생성하고 헤더에 추가를 해놓는 로직을 열심히 작성해놓고

마지막에

super 변수로 오버라이딩 안 한,

원래의 UsernamePasswordAuthenticationFilter 가 가지고 있던

successfulAuthentication 필터를 다시 한 번 동작시킨 것이었다....ㅎㅎ^^11

 

하...

 

 

 

부모 메서드를 호출하는 문장을 치우고 나니

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
        System.out.println("successfulAuthentication 실행 됐으니 로그인 인증이 완료됐네요");
        // authResult 객체로 jwt 토큰을 만들자 !
        PrincipalDetails principalDetails = (PrincipalDetails) authResult.getPrincipal();

        // java-jwt 라이브러리로 만들어 보자 !
        // RSA 방식 X
        // Hash 암호 방식
        String jwtToken = JWT.create()
                // 토큰이름?
                .withSubject("cos")
                // 토큰 만료 시간 10분
                .withExpiresAt(new Date(System.currentTimeMillis() + (60000 * 10)))
                //비공개 클레임 넣고싶은 키 밸류값 넣을 수 있음
                .withClaim("id", principalDetails.getUser().getId())
                .withClaim("username", principalDetails.getUser().getUsername()) //굳이?
                .sign(Algorithm.HMAC512("cos(sign)"));
        response.addHeader("Authorization", "Bearer"+jwtToken);
//        response.addHeader("\"Access-Control-Expose-Headers\"", "Authorization");
        System.out.println("헤더에 추가 완료");
        System.out.println("Bearer"+jwtToken);

    }

 

 

제대로 authorization 헤더에 토큰이 들어가는 것을 알 수 있다 ^^

 

 

하......................

 

 

 

 

 

오늘의 교훈

: 오버라이드 메소드를 단축키로 불러올 땐,

super 변수를 확인하고 지워주자....

728x90