너무 쉬운건 제외하고, 알면 편한 기본적인 타임리프 문법을 정리한다. # th:if (조건문) 비밀번호가 틀립니다. 조건문이 참일경우만 해당 태그가 작동한다. # th:each (반복문) eList는 model로 내려진 iterable한 객체이다. # th:href, @{} 링크식에 쿼리 파라미터는 이렇게 넣으면 된다. # th:with (지역 변수 선언) # input form에서 POST로 넘긴 데이터 받는법 (하나) method="POST"로 무조건 대문자로 해준다 넘길 데이터의 이름은 name="식별자" 로 넘긴다 컨트롤러에서는 @RequestParam("식별자") 로 받는다 # input form에서 POST로 넘긴 데이터 받는법 (여러개=객체) th:object="${넘길 객체 이름}" 으로 ..
# 프로젝트 소개 제목 : 슬기로운 문화생활 분류 : 학교 캡스톤디자인1 팀프로젝트 과목 프로젝트 팀원 : 4명 기간 : 한 학기 (3개월) 간략소개 : 문화 정보를 종합해서 제공하고, 커뮤니티 기능을 제공하는 안드로이드 어플리케이션 기획의도 : 코로나 19 장기화로 인해 시민들의 문화생활 감소 및 문화정보 제공 어플의 부족함을 발견하고 제작하게 됨 주요기능 : 현재 위치 중심 주변 문화정보 제공 지역/컨텐츠 카테고리별 문화정보 제공 커뮤니티 기능 (회원, 게시물, 쪽지) 사용기술 프론트 : 자바-안드로이드, 구글맵스, 레트로핏2 백 : 자바-스프링 부트, MySQL, AWS RDS, Spring Data JPA *코틀린을 사용하지 않고 자바로 안드로이드를 개발한 이유 : 팀원 모두가 자바 경험만 있어서..
웹 개발자로써 아주 기본적으로 알고 있어야할 간단한 웹 보안에 대해서 정리한다. 아래 소개하는 공격방법과 웹 취약점들은 당연히 실제 서비스를 대상으로 실습하면 안된다. (정보통신법 위반) 뭐 어차피 웬만한 서비스들은 해당 공격들에 대해서 방어책들이 구비되어 있을 것이다. 인증과 검증은 프론트에서도 수행하고 서버에서도 수행해서 더욱 보안을 강화한다. # 클라이언트 사이드 [XSS (Cross-site scripting)] 자바스크립트를 활용한 악의적인 스크립트를 실행하는 공격 기법. 이를 통해 공격자는 사용자의 인증 정보를 탈취할 수 있다. 저장(Stored) XSS = 악성 스크립트를 취약한 웹페이지 내부에 저장해놓는 방식 반사(Reflect) XSS = 웹 브라우저 URL로 악성 스크립트를 전송하여 공..
스프링 부트, 안드로이드 레트로핏2 통신 연동을 하면서 삽질했던 것들을 기록, 공유한다. # 애뮬레이터 로컬호스트 접근 안드로이드 애뮬레이터는 localhost로 서버에 접근할 수 없고, http://10.0.2.2:8080 꼭 이 주소로 접근해야함 (8080은 톰캣포트) # 레트로핏 @DELETE 쿼리에 바디 사용하기 원칙상 HTTP DELETE 메소드에는 바디를 사용할 수 없는데, 부득이하게 사용해야 하는 경우가 존재할 수 있다.(ex. 비밀번호 폼을 넘겨서 회원 탈퇴하기) 그럴땐 이렇게 메소드 매핑을 해주면 된다. @HTTP(method = "DELETE", path = "/users", hasBody = true)
# 서론 게시글이나 댓글 CRUD를 구성할때, 생성일과 수정일을 포함하고 싶은 경우가 있다. 이럴때 그냥 LocalDateTime을 엔티티 멤버변수로 넣어놔도 되지만 이러면 디비에 들어가는 양식이 이쁘지가 않다. (즉 포맷을 커스터마이징 하고 싶다.) 이를 편리하게 해주는게 하이버네이트에서 제공하는 EntityListener라는 기능을 알아보자 # EntityListener란? 하이버네이트가 DB에 어떤 행위를 하는 시점이나 그 이후 등 호출될 수 있는 콜백함수를 제공해주는 어노테이션이다. 즉, DB에 엔티티를 저장하기 전에 특정 행위를 할 수 있게 해준다. (MVC의 인터셉터와 비슷하다고 보면 된다.) 제공되는 콜백 옵션은 다음과 같다. @PrePersist manager persist 의해 처음 호출..
이전 포스팅에서 안드로이드 클라이언트와 로그인 유지 관련한 이슈가 있었다. https://mopil.tistory.com/43 [프로젝트] TeamOne - 안드로이드 로그인 유지의 필요성에 대한 고찰 현재 로그인 관련해서 이슈가 있다. 먼저, 백단에서는 다음과 같이 구현되어있다. 사용자가 로그인을 하면 HttpSession을 이용해서 세션값을 부여하고, 세션에 해당 멤버 정보를 저장한다. 사용자 mopil.tistory.com 이를 해결하기 위해 다음 고민을 했었다. # 1 서버 로그인 검증 포기 - 어차피 안드로이드 화면을 기준으로 로그인을 해야 다음 비즈니스 화면으로 넘어가므로, 서버에선 따로 인증을 하지 않는 방식이다. (즉, 인증을 프론트에 전담한다.) 장점 : 인증 관련한 고민을 백단에서 할 ..
현재 로그인 관련해서 이슈가 있다. 먼저, 백단에서는 다음과 같이 구현되어있다. 사용자가 로그인을 하면 HttpSession을 이용해서 세션값을 부여하고, 세션에 해당 멤버 정보를 저장한다. 사용자가 다른 도메인 CRUD (게시글 작성, 수정 등등)을 사용하려하면 로그인 인증 정보를 받아온다. ArgumentResolver를 활용하여 @Login 어노테이션을 도입해서 session이 null이면 바로 예외를 던지고, 아니면 로그인한 사용자 객체를 돌려주도록 만들었다. (자세한건 로그인 구현부분 참조) 프론트 응답으론, 최초 로그인시 멤버 객체와 세션값을 내려준다. 그리고 프론트(안드로이드)단은 다음과 같이 구현되어있다. 서버로 부터 받은 세션값을 쿠키매니저에 저장한다. 레트로핏 인터셉터를 활용해서 모든 ..
[Any 클래스] - 자바의 Object (최상위 클래스)와 동급 [함수 Unit 타입] - 리턴값이 없으면 : Unit으로 표기함 - 생략해도 됨 [확장함수] - 이미 선언되어있는 객체나 클래스 하위의 함수를 오버로딩, 오버라이딩 가능함 (String 클래스의 새로운 함수 추가하기) [lateinit] 기본 자료형을 제외(String은 가능)하고 객체 생성시 초기화를 하지 않고 변수 선언만 선언할 수 있게 하는 키워드 [타입캐스팅] as 타입으로 타입캐스팅함 [상속] - 디폴트가 상속 불가능임 - 부모 클래스에 open 키워드가 있어야 상속가능 - 오버라이딩도 open이 붙어야 오버라이딩 가능 [init] - 인스턴스를 생성하면서 수행할 메소드나 로직을 담을 수 있음(블록단위) init {} - ini..