일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JsonSerializer
- 스프링 부트
- 백트래킹
- @ConfigurationProperties
- 외부설정
- Application Event
- JPA
- Application Runner
- Spring Security
- HATEOAS
- 브루트포스
- 리소스핸들러
- 리소스 서버
- WebApplication Type
- cors
- 백준
- 백기선
- 정적 리소스
- rest api
- 스프링부트
- EnableAutoConfiguration
- AuthenticationPrincipal
- application.properties
- @Profile
- webjar
- 알고리즘
- OAuth2
- Application Argument
- 다익스트라
- HttpMessageConverters
- Today
- Total
목록Spring/스프링 기반 REST API 개발 (23)
아카이브
민감정보는 출력하지 않도록 JsonSerializer를 상속하자. Account의 id만 보내주도록 설정하기 @Override public void serialize(Account account, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); gen.writeNumberField("id", account.getId()); gen.writeEndObject(); } Event의 manager field에 적용하기 @JsonSerialize(using = AccountSerializer.class) // Event를 serialize 하는 경우, manager field에 대해서는 A..
SecurityContext 자바 ThreadLocal 기반 구현으로 인증 정보를 담고 있다. ※ ThreadLocal ? 오직 한 Thread에 의해서 read/write 가능한 variable을 생성할 수 있도록 하는 것(Thread Local Variable) 인증 정보를 꺼내는 방법 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); // Anonymous인 경우 principal = "anonymousUser" 로 String 이다. @AuthenticationPrincipal spring.security.User user 인증을 안했다 ? null : username과 authorities..
리소스 서버 OAuth2 인증 서버와 연동해서 사용한다. 리소스 인증 서버는 리소스를 제공하는 서버와 같이 두고, OAuth2 인증 서버는 따로 분리하는 게 맞다. 리소스에 대한 요청이 들어오면, OAuth2 서버에 access_token이 존재하는지 확인하고 없으면 접근을 제한한다. ResourceServer 설정 @EnableResourceServer extends ResourceServerConfigurerAdapter configure(ResourceServerSecurityConfigurer resources) resource_id configure(HttpSecurity http) anonymous GET /api/** : permit all POST /api/**: authenticated ..
OAuth2(Open Authorization, Open Authentication 2) : 인증을 위한 표준 프로토콜 1~5 단계는 Authorization Code 발급 요청 URL을 통해 진행할 수 있습니다. 7~8 단계는 서비스에서 callback URL을 통해 전달받은 Authorization Code를 사용하여 Access Token 요청 API를 통해 진행할 수 있습니다. 8 단계에서 발급받은 Access Token은 서비스에서 자체적으로 저장, 관리해야 합니다. 10~11 사용자의 서비스 요청 시 회원정보가 필요하다면 Access Token을 사용해 API를 호출할 수 있습니다. OAuth2 서버를 통해 인증 토큰을 받는다. 토큰 발행 테스트 User Client POST /oauth/to..
configure(HttpSecurity Http) 커스터마이징 익명 사용자 사용 활성화 폼 인증 방식 활성화 기본 로그인 페이지 제공 요청에 인증 적용 /api 이하 모든 GET 요청에 인증이 필요함 (permitAll()을 사용하여 인증이 필요 없이 익명으로 접근이 가능케 할 수 있음) 그밖에 모은 요청도 인증이 필요함 /* filterchain 안에서 거르기*/ @Override protected void configure(HttpSecurity http) throws Exception { http .anonymous()// 익명사용자 허용 .and() .formLogin()// 폼 인증 .and() .authorizeRequests()// 인증요청에 대해서 .mvcMatchers(HttpMetho..
시큐리티 필터를 적용하기 않음 /docs/index.html 로그인 없이 접근 가능 GET /api/events GET /api/events/{id} 로그인해야 접근 가능 나머지 다 POST /api/events PUT /api/events/{id} ... 스프링 시큐리티 OAuth 2.0 AuthorizationServer: OAuth2 토큰 발행(/oauth/token) 및 토큰 인증(/oauth/authorize) Oder 0 (리소스 서버보다 우선순위가 높다.) ResourceServer: 리소스 요청 인증 처리 (OAuth2 토큰 검사) Oder 3 (이 값은 현재 고칠 수 없음) 스프링 시큐리티 설정 @EnableWebSecurity, @EnableGlobalMethodSecurity exte..
스프링 시큐리티 웹 시큐리티 (Filter 기반 시큐리티): 웹 요청에 보안인증을 함 메서드 시큐리티: 웹과 상관없이 어떠한 메서드가 호출됐을 때 인증 또는 권한을 확인해줌 이 둘 다 Security Interceptor를 사용합니다 리소스에 접근을 허용할 것이냐 말것이냐를 결정하는 로직이 들어있음 Filter 기반으로 동작하기 때문에 Spring MVC와 분리되어 동작한다. 보안 관련 용어 접근 주체(Principal) : 애플리케이션에 접근하는 유저 인증(Authentication) : 접근한 유저를 식별하고, 접근할 수 있는지 검사 인가(Autorize) : 인증된 유저가 애플리케이션을 이용할 수 있는지 검사 SecurityFilterChain 브라우저가 서버에 데이터를 요청하면 여러 Servlet..
Account 도메인 추가하기 @Entity @Getter @Setter @EqualsAndHashCode(of="id") @Builder @NoArgsConstructor @AllArgsConstructor public class Account { @Id @GeneratedValue private Integer id; private String email; private String password; @ElementCollection(fetch = FetchType.EAGER) @Enumerated(value = EnumType.STRING) private Set roles; } AccountRole 추가하기 public enum AccountRole { ADMIN, USER } Event에 owen..
여러 컨트롤러 간의 중복 코드 제거하기 클래스 상속을 사용하는 방법 @Ingore 어노테이션으로 테스트로 간주되지 않도록 설정 중복 코드를 모아둔 BaseControllerTest class를 만들고 extends 하여 사용하기 하기 // 중복 어노테이션 @SpringBootTest @AutoConfigureMockMvc @AutoConfigureRestDocs @Import(RestDocsConfiguration.class) // bean import @ActiveProfiles("test") @Ignore // test로 간주되지 않도록 public class BaseControllerTest { // 중복 의존성 주입 @Autowired protected MockMvc mockMvc; @Autowi..
EventController에 updateEvent() 구현하기 @PutMapping("/{id}") public ResponseEntity updateEvent(@PathVariable Integer id, @RequestBody @Valid EventDto eventDto, Errors errors) { Optional byId = this.eventRepository.findById(id); if (byId.isEmpty()) {// 수정하려는 이벤트가 없는 경우, 404 NOT_FOUND return ResponseEntity.notFound().build(); } if (errors.hasErrors()) {// 입력 데이터 바인딩이 이상한 경우, 400 BAD_REQUEST return bad..