프로필

프로필 사진
Popomon
Frontend Developer
(2020/12 ~)

    카테고리

    포스트

    Spring Security - CSRF 처리

    2020. 2. 20. 07:27

    꿈가게: To Do List - iOS

    꿈가게: To Do List - Android

    Cross-Site Request Forgery(CSRF) 공격을 막기 위해서는 쿠키에 저장된 파라미터를 매개변수로 사용하여 인증에 대한 보안을 강화할 필요가 있습니다.

     

    CSRF 처리를 위해 인증 쿠키를 다루는 클래스

    import com.example.rest.security.util.CookieUtils;
    import com.nimbusds.oauth2.sdk.util.StringUtils;
    import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
    import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @Component
    public class HttpCookieOAuth2AuthorizationRequestRepository implements AuthorizationRequestRepository<OAuth2AuthorizationRequest> {
    
        public static final String OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME = "oauth2_auth_request";
        public static final String REDIRECT_URI_PARAM_COOKIE_NAME  = "redirect_uri";
        private static final int cookieExpireSeconds = 180;
    
        // 인증 쿠키 조회
        @Override
        public OAuth2AuthorizationRequest loadAuthorizationRequest(HttpServletRequest request) {
            return CookieUtils.getCookie(request, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME)
                    .map(cookie -> CookieUtils.deserialize(cookie, OAuth2AuthorizationRequest.class))
                    .orElse(null);
        }
    
        // 인증 쿠키 저장
        @Override
        public void saveAuthorizationRequest(OAuth2AuthorizationRequest authorizationRequest, HttpServletRequest request, HttpServletResponse response) {
            if (authorizationRequest == null) {
                CookieUtils.deleteCookie(request, response, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME);
                CookieUtils.deleteCookie(request, response, REDIRECT_URI_PARAM_COOKIE_NAME);
                return;
            }
    
            CookieUtils.addCookie(response, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME, CookieUtils.serialize(authorizationRequest), cookieExpireSeconds);
            String redirectUriAfterLogin = request.getParameter(REDIRECT_URI_PARAM_COOKIE_NAME);
            if (StringUtils.isNotBlank(redirectUriAfterLogin)) {
                CookieUtils.addCookie(response, REDIRECT_URI_PARAM_COOKIE_NAME, redirectUriAfterLogin, cookieExpireSeconds);
            }
        }
    
        @Override
        public OAuth2AuthorizationRequest removeAuthorizationRequest(HttpServletRequest request) {
            return this.loadAuthorizationRequest(request);
        }
    
        // 인증 쿠키 삭제
        public void removeAuthorizationRequestCookies(HttpServletRequest request, HttpServletResponse response) {
            CookieUtils.deleteCookie(request, response, OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME);
            CookieUtils.deleteCookie(request, response, REDIRECT_URI_PARAM_COOKIE_NAME);
        }
    }