목록분류 전체보기 (138)
DOing
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bwwxr3/btq2iroYKqH/AAO2mpT07gnqKfu3w1po7K/img.png)
1. 네이버 API에 등록 네이버 오픈 API로 이동해서 애플리케이션을 등록시켜 Client ID, Client Secret을 발급받는다. 2. appliation-oauth.properties 등록 네이버에서는 스프링 시큐리티를 공식 지원하지 않기때문에 그동안 Common-OAuth2Provider에서 해주던 값들도 전부 수동으로 입력해야한다. # registration spring.security.oauth2.client.registration.naver.client-id = (Client ID) spring.security.oauth2.client.registration.naver.client-secret = (Client Secret) spring.security.oauth2.client.regi..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/pVe5l/btq2hKvNZzx/xoNX2rkpoOBOm902er3ltK/img.png)
세션저장소에 대해 3가지방법 중 하나를 선택할 수 있다. 1. 톰캣 세션 사용하기 : 디폴트로 선택되는 방식 내장 톰캣(WAS)에 세션을 저장하게 되면 애플리케이션 실행시 항상 초기화가된다. 또 2대 이상의 WAS에서 서비스하고 있다면 톰캣들 간의 세션 동기화를 위한 추가설정이 필요하다. 2. MySQL과 같은 데이터베이스를 세션저장소로 사용하기 : 여러 WAS간의 공용 세션을 사용할 수 있는 가장 쉬운 방법 설정이 간단하지만 결국 로그인 요청마다 DB IO가 발생하여 성능상 이슈가 발생할 수 있다. 보통 로그인 요청이 많이 없는 백오피스, 사내시스템 용도에서 사용한다. 3. Redis와 같은 메모리 DB를 세션저장소로 사용하기 : B2C 서비스에서 가장 많이 사용하는 방식 실제 서비스가 사용되기 위해서..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/o55fb/btq2iVpksQB/BBqJh0ZO5CZx9dinp9g9iK/img.png)
1. 구글 클라우드 플랫폼에서 인증정보 발급받기 구글 서비스에 신규 서비스를 생성하고 발급된 인증정보(clientId와 clientSecret)을 통해서 로그인 기능과 소셜 서비스 기능을 사용할 수 있으니 발급받아야한다. OAuth 클라이언트 ID를 발급받는다. 그전에 동의화면을 만들어야함으로 동의화면 페이지로 넘어간다. 외부로 만들어주자! 동의화면을 모두 만들었다면 다시 OAuth 클라이언트 ID를 발급페이지로 간다. 애플리케이션유형을 웹으로 지정하고 승인된 리다이렉션 URL을 설정해준다. 승인된 리다이렉션 URL은 인증 성공시에 구글에서 리다이렉트할 URL이다. 스프링부트2 버전의 시큐리티에서는 기본적으로 {도메인}/login/oauth2/code/{소셜서비스코드}로 리다이렉트 URL을 지원하고 있다..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bzPEGR/btq1XheIQHy/dxYisKe5tGgY10cYMtvZkk/img.png)
저번 포스팅에서는 로그인과 로그아웃 기능을 구현해보았다. 이번 포스팅에서는 로그인의 성공, 실패 기능을 구현하겠다. 단순히 특정 페이지로 이동할 수도 있고 Handler를 통해서 특정한 로직을 수행하도록 할 수도 있다. 더불어서 로그인은 성공했으나, 사용자가 권한이 없을때 나오는 접근 제한 페이지와 로직도 구현해보자. 💡 이용하기 기본으로 제공되는 로그인 페이지는 위의 그림과 같다. 만약 직접 커스텀을 하고 싶다면 security-context.xml에 아래의 코드를 추가해준다. 이 외에도 태그에서는 로그인에 관련된 다른 일들을 할 수 있다. - username-parameter : 입력한 ID에 대한 파라미터명 - password-parameter : 입력한 PW에 대한 파라미터명 - login-pro..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bHxh3p/btq1JAAAaMP/T4VGrBg2NmrNvxU1Hawd3k/img.png)
1. pom.xml의 설정 org.springframework.security spring-security-core 5.0.6.RELEASE org.springframework.security spring-security-web 5.0.6.RELEASE org.springframework.security spring-security-config 5.0.6.RELEASE org.springframework.security spring-security-taglibs 5.0.6.RELEASE 2. security-context.xml 생성 스프링 시큐리티는 단독으로 설정할 수 있기때문에 별도로 security-context.xml을 따로 작성하는 것이 좋다. 네임스페이스에서 시큐리티 항목을 체크한다. XML을..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/qUHrX/btq1I66WiNZ/9fLyGGNWV8bXdQrw8D6dK1/img.png)
스프링 시큐리티는 인증 및 권한 부여를 제공하는 스프링 하위 프레임워크이다. 사실상 spring 기반 애플리케이션 보안을 위한 표준이라고 spring 공식 사이트에서 소개하고 있다. 동작 방식 스프링 시큐리티의 기본 동작 방식은 서블릿의 여러 필터와 인터셉터를 이용해서 처리된다. 필터(filter)와 인터셉터(interceptor)는 특정한 서블릿이나 컨트롤러의 접근에 관여한다는 점에서 유사하지만, 필터는 스프링과 무관한 서블릿 자원이고 인터셉터는 스프링의 빈으로 관리되면서 스프링의 컨텍스트 내에 속한다는 차이이다. 필터는 스프링과 무관하지만 인터셉터는 스프링 내부에서 컨트롤러를 호출할때 관여하기 때문에 스프링의 컨텍스트 내에 있는 모든 자원을 활용할 수 있다. 때문에 적용 시기에서도 차이가 보인다. 필..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dhmXLq/btq1IHEMbik/kokaujk9zKy0m27x4Cd7W1/img.png)
Spring에서 컨트롤러를 등록하는 방법에는 두가지가 있다. @Controller와 @RestController. @Controller는 주로 View를 반환한다. 하지만 @Controller에 @ResponseBody를 붙이면 view가 아닌 xml, json과 같은 데이터를 반환할 수 있다. (참고 : 2021.04.01 - [spring] - Controller에서 데이터 반환하기) 매번 @ResponseBody를 붙이는 것은 번거로우니 Spring 4.0부터는 @RestController를 지원하기 시작했다. @RestController @Controller + @ResponseBody Spring 4.0부터 사용가능한 어노테이션으로 @Controller에 @ResponseBody가 결합된 어노테..
Controller에서 비지니스 로직을 수행하고 처리한 데이터를 View에 넘겨 페이지에 표시한다. 이때 Controller에서 View로 데이터를 전달하는 방법에는 model(modelMap)과 modelAndView이 있다. 1. Model 데이터만 저장한다. Model은 파라미터 방식으로 넣어주고, String 형태로 View이름을 리턴한다. model.addAttribute("key","value")로 데이터 넣고 View에서 그 데이터를 사용한다. View페이지에서 ${key}이런식으로 데이터를 사용한다. @RequestMapping("/") public String toMainPage(Model model){ model.addAttribute("recentList", productService..