관리 메뉴

bright jazz music

blog 29 : 헤더 인증으로 변경, Intellij http 본문

Projects/blog

blog 29 : 헤더 인증으로 변경, Intellij http

bright jazz music 2023. 2. 13. 22:40

지난 포스팅에서는 AuthResolver에서 getParameter로 넘어오는 값을 분석해서 인증작업을 해줬다.

getParameter로 가져오면 다른 정보와 충돌이 생길 가능성이 있다. 따라서 인증정보는 헤더를 통해서 가져오는 것으로 변경한다.

 

 

1. ArgumentResolver 변경

//AuthResolver.java

package com.endofma.blog.config;

import com.endofma.blog.config.data.UserSession;
import com.endofma.blog.exception.Unauthorized;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

public class AuthResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        //컨트롤러에서 사용할 어노테이션이나 DTO가 사용자가 사용하려는 것이 맞는지, 지원하는지 체크한다.
        return parameter.getParameterType().equals(UserSession.class); //UserSession 클래스를 사용하는 것이 맞는지 확인. 맞으면 컨트롤러에 값 할당

    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        //실제로 해당 DTO에 값을 세팅해준다.

        //인증 작업 추가
//        String accessToken = webRequest.getParameter("accessToken");

        String accessToken = webRequest.getHeader("Authorization"); //헤더의 값으로 확인해준다.
        if (accessToken == null || accessToken.equals("")) {
            throw new Unauthorized();
        }

        //데이터베이스 사용자 확인작업
        //.. 추후 추가
//        UserSession userSession = new UserSession();
//        userSession.name = accessToken; 사용자 이름보다는 특정 값을 넣어주는 경우가 많다.
        return new UserSession(1L);
//        userSession.id = accessToken; 나중에 DB에서 조회해서 넣어준다고 가정
//        return userSession;
    }
}

 

2. 객체 필드 변경

관례상, 보안상 이름을 넣어주지 않기 때문에 바꿔준다.

//UserSession.java

package com.endofma.blog.config.data;

public class UserSession {

//    public String name;

    public final Long id;

    public UserSession(Long id) {
        this.id = id;
    }
}

 

3. Controller 변경

    //postController.java
    @GetMapping("/foo")
//    public String foo(UserSession userSession){
//        log.info(">>> {}", userSession.name);
//        return userSession.name;
    public Long foo(UserSession userSession){
        log.info(">>> {}", userSession.id);
        return userSession.id;
    }

 

 

아직 헤더에 값을 넣어주지 않았기 때문에 접근하지 못한다.

 

4. 헤더에 값 넣어주기

 

일반적으로 브라우저에서 헤더 값을 넣어주기는 번거롭다.

크롬의 경우 확장 프로그램을 설치해 준다.

 

4.1 ModHeader 설치

ModHeader 설치

 

 

헤더 값을 넣어주고 새로고침한다. 그러면 헤더에 값이 넣어진다.

 

 

authorization : catnails가 보인다.

 

 

현재는 헤더에 Authrization에 대한 값만 존재하면 통과하고, 1이 넣어진다.

주의

 

이런 프로그램을 사용하고 나서는 반드시 해당 프로그램을 종료하거나 초기화 해준다. 헤더에 특정 값이 들어가면 접근이 안되는 사이트도 존재하기 때문이다.

 

 

4.2 Intellij http 도구 사용하기

 

임의의 http 파일 생성.

이 방식은 쉽게 Http 요청을 테스트 할 수 있을 뿐만 아니라 파일이 소스 내에 포함되기 때문에 형상관리에도 용이하다.

 

요청 헤더에 asdf 값이 들어갔다.

 

응답 값으로는 1이 반환된 것을 볼 수 있다. 그리고 응답이 json파일 저장되었다.

 

저장 위치는 기본 값으로 .idea의 하위로 설정된 듯하다.

 

 

필요한 값들을 변수화 하여 사용할 수도 있다.

local / dev 등환경을 분리하여 테스트를 할 때도 유용하다.

 

 

 

 

 

 

 

Comments